java – 使用stream和lambda展平Map> to Map
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了java – 使用stream和lambda展平Map> to Map,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2149字,纯文字阅读大概需要4分钟。
内容图文
![java – 使用stream和lambda展平Map> to Map](/upload/InfoBanner/zyjiaocheng/706/1ac94b46d4194576a1a99cf003d36019.jpg)
我想展平一个Map,它将一个Integer键与一个String列表相关联,而不会丢失键映射.
我很好奇,好像使用stream和lambda这样做是有用的.
我们从这样的事情开始:
Map<Integer, List<String>> mapFrom = new HashMap<>();
我们假设mapFrom填充在某处,看起来像:
1: a,b,c
2: d,e,f
etc.
我们还假设列表中的值是唯一的.
现在,我想“展开”它以获得第二张地图:
a: 1
b: 1
c: 1
d: 2
e: 2
f: 2
etc.
我可以这样做(或者非常相似,使用foreach):
Map<String, Integer> mapTo = new HashMap<>();
for (Map.Entry<Integer, List<String>> entry: mapFrom.entrySet()) {
for (String s: entry.getValue()) {
mapTo.put(s, entry.getKey());
}
}
现在让我们假设我想使用lambda而不是嵌套for循环.我可能会这样做:
Map<String, Integer> mapTo = mapFrom.entrySet().stream().map(e -> {
e.getValue().stream().?
// Here I can iterate on each List,
// but my best try would only give me a flat map for each key,
// that I wouldn't know how to flatten.
}).collect(Collectors.toMap(/*A String value*/,/*An Integer key*/))
我也尝试过flatMap,但我不认为这是正确的方法,因为虽然它有助于我摆脱维度问题,但我在这个过程中失去了关键.
简而言之,我的两个问题是:
>是否可以使用流和lambda来实现这一目标?
>这样做是否有用(性能,可读性)?
解决方法:
您需要使用flatMap将值展平为新流,但由于您仍需要用于收集到Map的原始密钥,因此必须映射到保存键和值的临时对象,例如,
Map<String, Integer> mapTo = mapFrom.entrySet().stream()
.flatMap(e->e.getValue().stream()
.map(v->new AbstractMap.SimpleImmutableEntry<>(e.getKey(), v)))
.collect(Collectors.toMap(Map.Entry::getValue, Map.Entry::getKey));
Map.Entry是不存在的元组类型的替代,任何其他能够容纳两个不同类型的对象的类型就足够了.
另一种不需要这些临时对象的方法是自定义收集器:
Map<String, Integer> mapTo = mapFrom.entrySet().stream().collect(
HashMap::new, (m,e)->e.getValue().forEach(v->m.put(v, e.getKey())), Map::putAll);
这与toMap在静默覆盖重复键时不同,而如果存在重复键,没有合并函数的map将抛出异常.基本上,这个自定义收集器是一个并行能力的变种
Map<String, Integer> mapTo = new HashMap<>();
mapFrom.forEach((k, l) -> l.forEach(v -> mapTo.put(v, k)));
但请注意,即使使用非常大的输入映射,此任务也不会受益于并行处理.只有在流管道中存在可以从SMP中受益的额外计算密集任务时,才有可能从并行流中获益.或许,简洁,顺序的Collection API解决方案更可取.
内容总结
以上是互联网集市为您收集整理的java – 使用stream和lambda展平Map> to Map全部内容,希望文章能够帮你解决java – 使用stream和lambda展平Map> to Map所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。