【发布时间】:2017-05-17 22:28:56
【问题描述】:
所以我有这个“有效”的代码(为简单起见替换了一些名称):
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 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,我不知道如何让它工作。
任何想法将不胜感激。谢谢!
【问题讨论】:
-
在 Java 9 中,您将拥有
Collectors.flatMapping(),它可以让您在分组下游展平结果。
标签: java java-8 java-stream guava