因此,我有这段代码“有效”(为简单起见,替换了一些名称):
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;
}
我希望能够代替创建
Map<String, Map<String, ImmutableList<SomeClassB>>> someMap =
someListOfClassA.stream()
.filter(...)
. // not sure how to group by SomeClassA values while creating new SomeClassB instances
我不确定这是否适合上面的代码。如何基于SomeClassA的值构造SomeClassB的实例?
任何想法,将不胜感激。谢谢!
最佳答案
像这样使用收集器:
Map<String, Map<String, ImmutableList<SomeClassB>>> someMap =
someListOfClassA
.stream()
.filter(...)
.collect(Collectors.groupingBy(SomeClassA::someCriteriaA,
Collectors.groupingBy(SomeClassA::someCriteriaB,
Collectors.mapping(someClassA -> new SomeClassB(), GuavaCollectors.toImmutableList()))));
而您可以用代码替换
someClassA -> new SomeClassB()
,以将SomeClassA
的实例转换为SomeClassB
的实例。Collectors.mapping()将仅在收集发生之前应用给定功能。