java - 我们可以使用 java Stream 来重构它吗?
问题描述
是否可以在 Java 8 中使用 s重构以下for
循环?Stream
将状态从内部转移到外部,同时收集不同来源的列表?
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;}));
推荐阅读
- html - 如何在 Blogger 模板中创建 5 列部分
- angular - npm prod build 具有 pm-root 转到 AWS 存储桶的根目录而不是 Angular 构建文件
- java - 如何在 NetBeans 中打开 nfctools 库?
- laravel - 我在 laravel orm 中得到一个空值
- c++ - 别名模板是否被认为等于“相同”模板?
- sql - 生成 x & y 之间所有日期的列表
- perl - 如何将 Perl 字符串转换为数字(整数或浮点数)以满足 Moose 类型约束?
- php - 快速的问题,IF 语句似乎不适用于禁用元素的 while 循环
- react-redux - 用玩笑测试 useDispach
- mysql - Laravel Eloquent 仅加入最大值行