【发布时间】:2017-04-12 22:42:30
【问题描述】:
所以我有这个“有效”的代码(为简单起见替换了一些名称):
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 的实例?
任何想法将不胜感激。谢谢!
【问题讨论】:
-
Collectors.mapping(SomeClassB::new, GuavaCollectors.toImmutableList()) -
@4castle - 你能提供一些关于它如何工作的细节吗?如何从分组的 SomeClassA 对象中获取值到新创建的 SomeClassB 实例中?
-
SomeClassB::new可以替换为将SomeClassA实例转换为SomeClassB的任何lambda 或方法引用。Collectors.mapping只是在下游收集器中收集输出之前通过函数运行值。
标签: java java-8 java-stream