gpt4 book ai didi

Java 收集器按动态字段分组

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:31:05 25 4
gpt4 key购买 nike

我有以下嵌套的 groupingBy block :

Map<String,Map<String,Long>> namesCountersMap =
events.stream().collect(
Collectors.groupingBy(
namesDAO::getName,
Collectors.groupingBy(
genericDAO::SOME_DYNAMIC_FIELD,
Collectors.counting())
)
);

有一种情况我需要调用这个 block 3 次,我唯一改变的是内部 groupingBy 字段(“SOME_DYNAMIC_FIELD”)。

基本上我想做的是,每次都对不同的字段(在第二级)使用分组依据和计数,然后合并结果。

例子:

{
"NamesRecords": {
"Sam": {
"Cars": 4
"Bags": 6
"Houses": 2
},

"Bob": {
"Cars": 2
"Bags": 1
"Houses": 3
},

}
}

如您所见,第 2 级的 group-by 由 3 个不同的字段完成,这就是为什么我需要将这段代码重复三次。

如果我将 fieldToGroupBy 的参数传递给函数,有没有办法动态使用它?或者,如果您对如何避免代码重复有任何其他想法,我很乐意听取。

最佳答案

Collectors.groupingBy 的第一个参数是 Function<T,R> , 因此您可以使用该类型的变量。

它只是一个函数式接口(interface),带有一个方法来提取要分组的值,它可以通过方法引用、lambda 表达式、匿名类或任何其他类型的对象来实现类。

Function<namesDAO, String> classifier2 = genericDAO::SOME_DYNAMIC_FIELD;

Map<String,Map<String,Long>> namesCountersMap =
events.stream().collect(
Collectors.groupingBy(
namesDAO::getName,
Collectors.groupingBy(
classifier2,
Collectors.counting())
)
);

现在您可以为 classifier2 分配不同的值,例如

Function<namesDAO, String> classifier2 = someDAO::getCars;

Function<namesDAO, String> classifier2 = otherDAO::getBags;

Function<namesDAO, String> classifier2 = dao -> dao.getHouses();

关于Java 收集器按动态字段分组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55655683/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com