如何解决在Java中使用groupby进行动态分组
我正在某种情况下工作。
用户在其中选择一些列,并完成对它们的分组。
我已经使用了标准,现在我想使用Java groupby()进行分组。
考虑我有一个实体Employee:
package com.demo;
public class Employee {
int id;
String name;
String address;
String phoneno;
String designation;
public Employee(int id,String name,String address,String phoneno,String designation) {
super();
this.id = id;
this.name = name;
this.address = address;
this.phoneno = phoneno;
this.designation = designation;
}
}
// getter and setters
我创建了另一个用于分组的类
public class GroupHere {
public static void main(String arg[]) {
Function<Employee,List<Object>> classifier = (emp) ->
Arrays.<Object>asList(emp.getAddress(),emp.getName());
Map<Employee,Long> groupedEmployee = employee.stream()
.collect(Collectors.groupingBy(Function.identity(),Collectors.counting()));
System.out.println("key" + groupedEmployee .keySet());
System.out.println("Grouped by" + groupedEmployee );
}
}
现在我想动态创建我的分类器,以便当用户选择“''name''''和“''phoneno'''时 分类器中应该包含这些吸气剂。
我在这里很困惑。
此外,当用户选择详细信息位于JSON中的属性/列时。
{
[ attributes: name,groupable: true ],[ attributes: phoneno,groupable: true ]
}
如何将属性与 Employee 的 getters 映射并添加到分类器中?
还是他们可以通过其他任何方式对这些属性进行分组?
解决方法
您可以通过使用从属性名称到属性提取器的映射来完成此操作,即:
Map<String,Function<Employee,Object>> extractors = new HashMap<>();
extractors.put("name",Employee::getName);
extractors.put("address",Employee::getAddress);
extractors.put("phoneno",Employee::getPhoneno);
extractors.put("designation",Employee::getDesignation);
拥有此地图后,您可以使用它动态创建分类器:
List<String> attributes = ...; // get attributes from JSON (left as exercise)
Function<Employee,List<Object>> classifier = emp -> attributes.stream()
.map(attr -> extractors.get(attr).apply(emp))
.collect(Collectors.toList());
现在,您可以使用此分类器来管理员工:
Map<List<Object>,Long> groupedEmployees = employees.stream()
.collect(Collectors.groupingBy(classifier,Collectors.counting()));
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。