Java 8 Streams:Make Collectors.groupingBy返回Map>而不是Map >>
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了Java 8 Streams:Make Collectors.groupingBy返回Map>而不是Map >>,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2149字,纯文字阅读大概需要4分钟。
内容图文
![Java 8 Streams:Make Collectors.groupingBy返回Map>而不是Map >>](/upload/InfoBanner/zyjiaocheng/735/90c7e16f513749bb8078bef2b9f037cf.jpg)
我有一个List< SomeBean>. SomeBean包含一个返回K的方法,该方法可以在列表中重复,另一个方法返回List< V>.由于我如何使用SomeBean,它几乎类似于具有键K的条目值List< V>.
我想将其转换为Map< K,List< V>>,其中List< V>是具有相同密钥K的列表的串联.
这是我做的:
private static Map<K, List<V>> transformToMapOfListInTwoSteps(List<SomeBean> paginationResult) {
Map<K, List<List<V>>> mapOfListOfList = paginationResult.stream()
.collect(Collectors.groupingBy(SomeBean::getK, Collectors.mapping(SomeBean::getV, Collectors.toList())));
return mapOfListOfList.entrySet().stream()
.collect(Collectors.toMap(Map.Entry::getKey, entry -> entry.getValue().stream().flatMap(Collection::stream).collect(Collectors.toList())));
}
然而,这目前分两步完成.如何在不使用中间一次性地图< K,List< List< V>>>?的情况下执行相同的操作
解决方法:
我认为你过于复杂化了一些事情.我只是使用Collectors.toMap的重载接受合并函数,当它在键上发现碰撞时组合这些值:
private static <K, V> Map<K, List<V>> transformToMapOfListInOneStep(
List<SomeBean> paginationResult) {
return paginationResult.stream()
.collect(Collectors.toMap(
SomeBean::getK,
someBean -> new ArrayList<>(someBean.getV()),
(v1, v2) -> { v1.addAll(v2); return v1; }));
}
注意:我在值映射器函数中创建了一个新的ArrayList,因为我不想修改作为SomeBean属性的原始列表.
另一种方法是使用Collectors.groupingBy以及对值进行平面映射的下游收集器,但这不是在Java 8中实现的(尽管它将在Java 9中提供,见Collectors.flatMapping).
在Java 8中,这可以实现为:
public static <T, U, A, R> Collector<T, ?, R> flatMapping(
Function<? super T, ? extends Stream<? extends U>> mapper,
Collector<? super U, A, R> downstream) {
BiConsumer<A, ? super U> acc = downstream.accumulator();
return Collector.of(downstream.supplier(),
(a, t) -> {
try (Stream<? extends U> s = mapper.apply(t)) {
if (s != null) s.forEachOrdered(u -> acc.accept(a, u));
}
},
downstream.combiner(), downstream.finisher(),
downstream.characteristics().toArray(new Collector.Characteristics[0]));
}
你可以这样使用它:
return paginationResult.stream()
.collect(Collectors.groupingBy(
SomeBean::getK,
flatMapping(
someBean -> someBean.getV().stream(),
Collectors.toList())));
注2:我从this answer given by user @Holger开始实现flatMapping方法.
内容总结
以上是互联网集市为您收集整理的Java 8 Streams:Make Collectors.groupingBy返回Map>而不是Map >>全部内容,希望文章能够帮你解决Java 8 Streams:Make Collectors.groupingBy返回Map>而不是Map >>所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。