java - 我们可以使用 java Stream 来重构它吗?

标签 java java-8 java-stream

是否可以在 Java 8 中使用 Stream重构以下 for 循环?

在收集不同来源的列表时将状态从内部移动到外部?

Map<StateEnum, List<List<ThreadDo>>> stateDumpListMap = new HashMap<>();
for (ThreadDumpDo dumpDo : dumpDoList) {
    Map<StateEnum, List<ThreadDo>> stateDoListMap = getStateGroup(dumpDo);
    stateDoListMap.entrySet().stream().forEach(entry -> {
       stateDumpListMap.putIfAbsent(entry.getKey(), new ArrayList<>());
       stateDumpListMap.get(entry.getKey()).add(entry.getValue());
     });
}

最近我尝试了几个用例,但对我来说似乎很难看。

我尝试使用 stream().map() 来实现这一点,但我失败了。有人可以帮忙吗?

最佳答案

这里有一种方法,使用collect代替forEach生成Map,使用flatMap消除for 循环:

Map<StateEnum, List<List<ThreadDo>>> stateDumpListMap =
    dumpDoList.stream ()
              .flatMap (d->getStateGroup(d).entrySet().stream ())
              .collect(Collectors.toMap (Map.Entry::getKey,
                                         e -> {
                                            List<List<ThreadDo>> l = new ArrayList<>(); 
                                            l.add (e.getValue());
                                            return l;
                                         },
                                         (v1,v2)->{v1.addAll(v2);return v1;}));

正如 Aominè 所说,可以简化为:

Map<StateEnum, List<List<ThreadDo>>> stateDumpListMap =
    dumpDoList.stream ()
              .flatMap (d->getStateGroup(d).entrySet().stream ())
              .collect(Collectors.toMap (Map.Entry::getKey,
                                         e -> new ArrayList<>(Collections.singletonList(e.getValue())),
                                         (v1,v2)->{v1.addAll(v2);return v1;}));

关于java - 我们可以使用 java Stream 来重构它吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50714245/

相关文章:

java - 如何实现工厂方法模式的灵活性

java - 如何在事务打开后立即查询 SQL?

java - 链表删除最后一次发生

Java 8 forEach 只适用于某些?

java - 解决Java 8 Stream里面no final variable

java - 在更新的 4.1 版本中对 Singleton 类使用双重锁定时,Sonarlint 在 volatile 对象引用上给出错误

java - 在制作电子商务网站的搜索引擎时,如何处理空格位置错误的搜索查询?

java - 查找层次结构

java - 嵌套的 Java 8 并行 forEach 循环执行不佳。这种行为是预期的吗?

Java 8 版本 - 带条件的列表映射