【发布时间】:2018-11-06 21:35:24
【问题描述】:
我在正确组合多个 Collectors::groupingBy 函数然后将它们一次全部应用于给定输入时遇到问题。
假设我有一些类实现了以下接口:
interface Something {
String get1();
String get2();
String get3();
String get4();
}
现在我可以从这个接口获得一些方法组合的列表,即这些列表可以是:
[Something::get1, Something::get3], [Something::get2, Something::get1, Something::get3].
现在,有了这样一个方法列表和一个东西列表,我想按 getter 对这些东西进行分组。
我的意思是,例如,对于列表 [Something::get1, Something::get3] 和列表 [Something1, Something2, ...],我希望首先按 get1 分组,然后按 get2 分组。
可以这样实现:
var lst = List.of(smth1, smth2, smth3);
lst.stream()
.collect(Collectors.groupingBy(Something::get1, Collectors.groupingBy(Something::get3)))
如果我有任何想要应用于分组的任意方法列表怎么办?
我在想这样的事情(ofc。这不起作用,但你会明白的):
假设List<Function<Something, String>> groupingFunctions 是我们要应用于分组的方法列表。
var collector = groupingFunctions.stream()
.reduce((f1, f2) -> Collectors.groupingBy(f1, Collectors.groupingBy(f2)))
然后
List.of(smth1, smth2, smth3).stream().collect(collector)
但是这种方法行不通。如何达到我想的结果?
【问题讨论】:
-
最终结果如何?
-
最终结果是嵌套地图。
-
最终的
Map键值类型是4嵌套的,可以raw type吗? -
如果你不知道它的类型,你会如何使用结果?
-
@Holger - 如果Something 有一个属性
List<Something> children和一个属性String name,我会将映射重新映射到Something 对象,其中键是名称,列表将是孩子,所以这不会有问题。我只是想有一个通用的解决方案来创建一个深度嵌套的树状结构。
标签: java java-stream collectors