在 java 中使用 groupby() 进行动态分组
Dynamic Grouping using groupby() in java
我正在处理一些场景。
用户选择一些列并完成并显示它们的分组。
我已经完成了使用条件,现在我想使用 java groupby() 来分组。
假设我有一个实体员工:
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
我创建了另一个class用于分组
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 );
}
}
现在我想动态创建我的 classifier,这样当用户选择“'name'”和“'phoneno'”时
classifier 应该有这些吸气剂。
我在这里很困惑。
此外,当用户选择 attributes/column 时,详细信息在 JSON 中。
{
[ attributes: name, groupable: true ],
[ attributes: phoneno, groupable: true ]
}
如何将 属性 映射到 Employee 的 getters 并添加到 class运算符 ?
或者他们是否有任何其他方式对这些属性进行分组?
您可以使用从属性名称到属性提取器的映射来实现,即:
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()));
我正在处理一些场景。
用户选择一些列并完成并显示它们的分组。
我已经完成了使用条件,现在我想使用 java groupby() 来分组。
假设我有一个实体员工:
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
我创建了另一个class用于分组
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 );
}
}
现在我想动态创建我的 classifier,这样当用户选择“'name'”和“'phoneno'”时 classifier 应该有这些吸气剂。
我在这里很困惑。
此外,当用户选择 attributes/column 时,详细信息在 JSON 中。
{
[ attributes: name, groupable: true ],
[ attributes: phoneno, groupable: true ]
}
如何将 属性 映射到 Employee 的 getters 并添加到 class运算符 ?
或者他们是否有任何其他方式对这些属性进行分组?
您可以使用从属性名称到属性提取器的映射来实现,即:
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()));