使用流API的Java中n字段分组算法
需要根据N个属性字段对List<Object>
进行分组,这些字段在运行时决定。我怎样才能做到这一点
Group by multiple field names in java 8 提到这个问题,它使用的是固定数量的字段
例如:
Person{ int age, String city, Date doj, double salary}
record1: 25, NYC, 02/25/2018, 50000
record2: 25, MEX, 02/25/2017, 70000
record3: 26, MEX, 02/25/2017, 80000
GroupBy(city, doj)
Record1: = MEX, 02/25/2017, 150000
Record2: = NYC, 02/25/2018, 50000
工资将会增加
我将结果存储在Map<Object, List<Object>>
我已经完成了大部分。我面临的唯一问题是如何在groupingBy中更改键
Collectors.groupingBy( date )
:第二次迭代将混乱所有城市的数据,这些城市将被city+date
分组。如果我能将密钥更改为^{Collectors.groupingBy( date )
# 1 楼答案
使用JB Nizet建议的解决方案,我已经整理出了一个完整的工作解决方案,您可以在其中按n个字段进行分组
这个嵌套属性将帮助我们存储分组的密钥
这里的字段是一个简单的对象,将在运行时提供。我们可以有更好的选择来决定它的类型
这个接口应该由POGO实现,以定义什么是聚合策略
然后使用NestedProperty对象,我们使用流将记录分组到n-1个字段。groupby函数
然后我们可以运行主聚合方法
请参考以下链接中的答案: http://www.unbounded.in/group-by-n-fields-in-java-like-sql-using-streams-api/
# 2 楼答案
下面是一个完整的例子:
它的作用是:
List<Property>
,其中包含(例如)属性CITY和DOJList<PropertyValue>
的分组密钥,因此,第一个人将转换为[NYC,2018年2月25日],而第二个人和第三个人都将转换为[MEX,2017年2月25日](因此具有相同的密钥)李>