Java 8流将List项减少并组合到Map
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了Java 8流将List项减少并组合到Map,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含1630字,纯文字阅读大概需要3分钟。
内容图文
我需要使用name1 / 2求和值value1 / 2的键创建映射.
什么可能是使用java 8流重写这个最干净的方法?
class Item {
private String name1;
private Integer value1;
private String name2;
private Integer value2;
public Item(final String name1, final Integer value1, final String name2, final Integer value2) {
this.name1 = name1;
this.value1 = value1;
this.name2 = name2;
this.value2 = value2;
}
//getters and setters
}
List<Item> list = Lists.newArrayList(
new Item("aaa", 1, "bbb", 2),
new Item("bbb", 5, "ccc", 3),
new Item("aaa", 8, "bbb", 7),
new Item("bbb", 2, "aaa", 5));
Map<String, Integer> map = Maps.newHashMap();
for (Item item : list) {
map.merge(item.name1, item.value1, Integer::sum);
map.merge(item.name2, item.value2, Integer::sum);
}
System.out.println(map);//{aaa=14, ccc=3, bbb=16}
解决方法:
一种可能的解决方案是将每个项目平面映射到由两个条目组成的流中:每个条目将由名称和相应的值组成.然后,通过对具有相同键的值的值求和,将其收集到映射中.由于没有内置对来保存这两个值,我们可以使用AbstractMap.SimpleEntry.
Map<String, Integer> map =
list.stream()
.flatMap(i -> Stream.of(new AbstractMap.SimpleEntry<>(i.name1, i.value1), new AbstractMap.SimpleEntry<>(i.name2, i.value2)))
.collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue, Integer::sum));
或者,仅使用自定义收集呼叫可能更简单.累加器合并每个键,就像你在for循环体中一样.棘手的部分是组合器,在这种情况下,通过迭代第二个映射的条目并将它们合并到第一个映射中,将两个映射合并在一起.
Map<String, Integer> map =
list.stream()
.collect(
HashMap::new,
(m, i) -> {
m.merge(i.name1, i.value1, Integer::sum);
m.merge(i.name2, i.value2, Integer::sum);
},
(m1, m2) -> m2.forEach((k, v) -> m1.merge(k, v, Integer::sum))
);
内容总结
以上是互联网集市为您收集整理的Java 8流将List项减少并组合到Map全部内容,希望文章能够帮你解决Java 8流将List项减少并组合到Map所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。