java - 在嵌套 Map 中使用 groupingBy,但收集到不同类型的对象

标签 java java-8 java-stream guava

所以我有这段“有效”的代码(为简单起见替换了一些名称):

 Map<String, Map<String, ImmutableList<SomeClassA>>> someMap =
      someListOfClassA.stream()
      .filter(...)
      .collect(Collectors.groupingBy(SomeClassA::someCriteriaA,
            Collectors.groupingBy(SomeClassA::someCriteriaB, GuavaCollectors.toImmutableList()
            )
      ));

但是,我想更改此代码,以便在按 SomeClassA 字段分组后,内部集合属于 SomeClassB。例如,如果类如下所示:

假设他们都有所有的参数构造函数

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 B 的结果列表展平为

Map<String, 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, Map<String, List<SomeClassB>>> someMap =
                someListOfClassA.stream()
                        .filter(...)
                        .collect(Collectors.groupingBy(SomeClassA::getSomeCriteriaA,
                                Collectors.groupingBy(SomeClassA::getSomeCriteriaB,
                                        Collectors.mapping(a -> getSomeClassBsFromSomeClassA(a),
                                                flatMapToImmutableList()))));

关于java - 在嵌套 Map 中使用 groupingBy,但收集到不同类型的对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44035738/

相关文章:

java - 我应该将 CSV json 字符串转换为 int java 成员什么类型

java - 将 for 循环转换为 java8 风格

Java Long Stream 包含特定数字

java - 如何从 Java 中的动态源创建对象流?

java - 为什么 Stream 没有 toList() 方法?

java - 无法从二级类访问公共(public)非静态类属性

java - 计算需要将数字添加到坐标才能改变下限值的次数

java - 为每个请求设置属性 (Spring REST)

java - 任何支持 Process.supportsNormalTermination==true 的虚拟机?

java - OSX 系统菜单栏在 JavaFX 中不工作