java – 将groupingBy用于嵌套Map,但收集到不同类型的对象
发布时间:2020-12-15 04:38:45 所属栏目:Java 来源:网络整理
导读:所以我有这个“工作”的代码(为简单起见替换一些名称): MapString,MapString,ImmutableListSomeClassA someMap = someListOfClassA.stream() .filter(...) .collect(Collectors.groupingBy(SomeClassA::someCriteriaA,Collectors.groupingBy(SomeClassA::so
所以我有这个“工作”的代码(为简单起见替换一些名称):
Map<String,Map<String,ImmutableList<SomeClassA>>> someMap = someListOfClassA.stream() .filter(...) .collect(Collectors.groupingBy(SomeClassA::someCriteriaA,Collectors.groupingBy(SomeClassA::someCriteriaB,GuavaCollectors.toImmutableList() ) )); 但是,我想更改此代码,以便在通过SomeClassA字段进行分组后,内部集合是SomeClassB.例如,如果类看起来像这样: 假设他们都拥有所有args构造函数 class SomeClassA { String someCriteriaA; String someCriteriaB; T someData; String someId; } class SomeClassB { T someData; String someId; } 并且有一个方法: public static Collection<SomeClassB> getSomeClassBsFromSomeClassA(SomeClassA someA) { List<Some List of Class B> listOfB = someMethod(someA); return listOfB; // calls something using someClassA,gets a list of SomeClassB } 我想将SomeClass Bs的结果列表展平为 Map<String,ImmutableList<SomeClassB>>> someMap = someListOfClassA.stream() .filter(...) . // not sure how to group by SomeClassA fields but result in a list of SomeClassB since one SomeClassA can result in multiple SomeClassB 我不确定这将如何适合上面的代码.如何将基于SomeClassB的一堆列表收集到SomeClassA的所有值的单个列表中?如果单个ClassA映射到单个ClassB,我知道如何使用Collectors.mapping使它工作,但由于每个ClassA导致多个ClassB,我不知道如何让它工作. 任何想法,将不胜感激.谢谢! 解决方法
使用这样的自定义收集器:
private static Collector<Collection<SomeClassB>,?,ImmutableList<SomeClassB>> flatMapToImmutableList() { return Collectors.collectingAndThen(Collectors.toList(),listOfCollectionsOfB -> listOfCollectionsOfB.stream() .flatMap(Collection::stream) .collect(GuavaCollectors.toImmutableList())); } 你可以实现你所追求的目标: Map<String,List<SomeClassB>>> someMap = someListOfClassA.stream() .filter(...) .collect(Collectors.groupingBy(SomeClassA::getSomeCriteriaA,Collectors.groupingBy(SomeClassA::getSomeCriteriaB,Collectors.mapping(a -> getSomeClassBsFromSomeClassA(a),flatMapToImmutableList())))); (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |