首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何用流迭代Java 8中的HashMap of ArrayList

如何用流迭代Java 8中的HashMap of ArrayList
EN

Stack Overflow用户
提问于 2017-08-04 17:12:28
回答 3查看 8K关注 0票数 2

我有以下数据集,键是字符串,值作为值列表。

我想用键和list的每个值作为方法的参数来调用一个方法。迭代所有的键。我可以用两个forEach循环来完成它,如下面的示例所示。我想知道我们是否可以在没有flatMap内环的情况下使用Java8中的流和forEach编写相同的逻辑?谢谢

代码语言:javascript
运行
复制
Map<String,ArrayList<String>> xhashMap ;

if(xhashMap!=null)  {

 xhashMap.forEach((k,l)-> {

    if(k.equals("ax")){
           l.forEach(v->{
            method1(v,AA.class);
           }
     }
    if(k.equals("bx")){
           l.forEach(v->{
            method1(v,BB.class);
           }
     }

  });

}
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2017-08-06 15:53:25

无论您使用的是for循环、forEach还是Stream API,都不重要。在所有情况下,您都要在Map上迭代,以便将每个键与某个值进行比较,这就违背了映射的概念,将键与值关联起来,并提供(通常更好的线性)查找方法。

此外,您应该使用Map<String, List<String>>,而不是引用像ArrayList这样的实现类型,而不是首先让它成为null,而不是让它稍后检查null

如果您遵循这些建议,您的代码就会变成

代码语言:javascript
运行
复制
Map<String, List<String>> xhashMap;
// always initialize the map to a non-null reference

xhashMap.getOrDefault("ax", Collections.emptyList())
        .forEach(v -> method1(v, AA.class));
xhashMap.getOrDefault("bx", Collections.emptyList())
        .forEach(v -> method1(v, BB.class));

如果如变量名所示,映射是一个散列映射,那么两个查找将具有O(1)时间复杂性,但即使是具有O(log(n))复杂性的TreeMap也比遍历映射和比较所有键要好。

只要操作由具有不同参数的唯一方法调用组成,尝试重用公共代码就不会有多大好处,因为共享代码要复杂得多。

票数 1
EN

Stack Overflow用户

发布于 2017-08-04 18:02:06

是的,我们不能用Stream编写它,但是它并不是更好。

由于您执行的是副作用而不是收集结果,所以Stream本质上是:

代码语言:javascript
运行
复制
xhashMap.entrySet()
  .stream()
  .forEach(e -> ...);

不幸的是,在forEach中包含相同的逻辑。

实际上,您甚至可以跳过Stream创建,因为您可以在不创建Stream的情况下执行forEach

代码语言:javascript
运行
复制
xhashMap.entrySet()
  .forEach(e -> ...);
票数 1
EN

Stack Overflow用户

发布于 2017-08-12 12:04:21

当然可以用flatMap和闭包来完成

代码语言:javascript
运行
复制
xHashMap.entrySet().stream()
                .flatMap(e -> e.getValue().stream()
                        .<Runnable>map(v -> () -> {
                            final String k = e.getKey();
                            if (k.equals("ax")) {
                                method1(v, AA.class);
                            }
                            if (k.equals("bx")) {
                                method1(v, BB.class);
                            }
                        })
                )
                .forEach(Runnable::run);
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45512256

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档