加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

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()))));

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读