过滤不同的组并获取解析为 Integer 或 Double 的 String 值的平均值
Filter distinct groups and get average of String values parsing as Integer or Double
我有一个如下所示的 POJO:
@Data
class Employee {
private int id;
private String name;
private String salary;
private String departmentName;
}
还有如下列表:
List<Employee> employees = new ArrayList<>();
Employee emp1 = new Employee(1, "Jiya Brein", "4000", "HR");
Employee emp2 = new Employee(2, "Paul Niksui", "2000", "IT");
Employee emp3 = new Employee(3, "Martin Theron", "5000", "HR");
Employee emp4 = new Employee(4, "Murali Gowda", "6000", "IT");
Employee emp5 = new Employee(5, "Jacob Arthur", "8000", "HR");
employees.add(emp1);
employees.add(emp2);
employees.add(emp3);
employees.add(emp4);
employees.add(emp5);
现在我正在尝试按部门筛选和分组所有员工,需要获得支出最高的部门。
如果工资是 Double
类型(比如)我可以像下面那样做:
Employee emp1 = new Employee(1, "Jiya Brein", 4000d, "HR");
Employee emp2 = new Employee(2, "Paul Niksui", 2000d, "IT");
Employee emp3 = new Employee(3, "Martin Theron", 5000d, "HR");
Employee emp4 = new Employee(4, "Murali Gowda", 6000d, "IT");
Employee emp5 = new Employee(5, "Jacob Arthur", 8000d, "HR");
Map<String, Double> avgSalaryOfDepartments = employees.stream().collect(
Collectors.groupingBy(Employee::getDepartmentName, Collectors.averagingDouble(Employee::getSalary)));
Set<Entry<String, Double>> entrySet = avgSalaryOfDepartments.entrySet();
Map.Entry<String, Double> maxSpenderDept = null;
for (Entry<String, Double> entry : entrySet) {
System.out.println(entry.getKey() + " : " + entry.getValue());
if (maxSpenderDept == null || entry.getValue().compareTo(maxSpenderDept.getValue()) > 0) {
maxSpenderDept = entry;
}
}
return maxSpenderDept.toString();
我得到了预期的输出:
HR : 5666.666666666667
IT : 4000.0
The highest spending department is HR=5666.666666666667
但是如果我得到 String 形式的薪水并且必须使用 Java 8 的流链接将其解析为 Double,我不知道该怎么办?
你可以边解析边取平均。尝试使用这个 lambda:
emp -> Double.parseDouble(emp.getSalary())
代替此方法参考:
Employee::getSalary
完整管道:
Map<String, Double> avgSalaryOfDepartments =
employees.stream()
.collect(groupingBy(Employee::getDepartmentName,
averagingDouble(emp -> Double.parseDouble(emp.getSalary()))));
以防万一你想仅使用流直接查找 max avg salary 部门名称
String deptWithMaxAvgSal = employees.stream().collect(
Collectors.groupingBy(Employee::departmentName,
Collectors.averagingDouble(emp->Double.parseDouble(emp.salary())))).entrySet().stream().max(Map.Entry.comparingByValue()).get().getKey();
我有一个如下所示的 POJO:
@Data
class Employee {
private int id;
private String name;
private String salary;
private String departmentName;
}
还有如下列表:
List<Employee> employees = new ArrayList<>();
Employee emp1 = new Employee(1, "Jiya Brein", "4000", "HR");
Employee emp2 = new Employee(2, "Paul Niksui", "2000", "IT");
Employee emp3 = new Employee(3, "Martin Theron", "5000", "HR");
Employee emp4 = new Employee(4, "Murali Gowda", "6000", "IT");
Employee emp5 = new Employee(5, "Jacob Arthur", "8000", "HR");
employees.add(emp1);
employees.add(emp2);
employees.add(emp3);
employees.add(emp4);
employees.add(emp5);
现在我正在尝试按部门筛选和分组所有员工,需要获得支出最高的部门。
如果工资是 Double
类型(比如)我可以像下面那样做:
Employee emp1 = new Employee(1, "Jiya Brein", 4000d, "HR");
Employee emp2 = new Employee(2, "Paul Niksui", 2000d, "IT");
Employee emp3 = new Employee(3, "Martin Theron", 5000d, "HR");
Employee emp4 = new Employee(4, "Murali Gowda", 6000d, "IT");
Employee emp5 = new Employee(5, "Jacob Arthur", 8000d, "HR");
Map<String, Double> avgSalaryOfDepartments = employees.stream().collect(
Collectors.groupingBy(Employee::getDepartmentName, Collectors.averagingDouble(Employee::getSalary)));
Set<Entry<String, Double>> entrySet = avgSalaryOfDepartments.entrySet();
Map.Entry<String, Double> maxSpenderDept = null;
for (Entry<String, Double> entry : entrySet) {
System.out.println(entry.getKey() + " : " + entry.getValue());
if (maxSpenderDept == null || entry.getValue().compareTo(maxSpenderDept.getValue()) > 0) {
maxSpenderDept = entry;
}
}
return maxSpenderDept.toString();
我得到了预期的输出:
HR : 5666.666666666667
IT : 4000.0
The highest spending department is HR=5666.666666666667
但是如果我得到 String 形式的薪水并且必须使用 Java 8 的流链接将其解析为 Double,我不知道该怎么办?
你可以边解析边取平均。尝试使用这个 lambda:
emp -> Double.parseDouble(emp.getSalary())
代替此方法参考:
Employee::getSalary
完整管道:
Map<String, Double> avgSalaryOfDepartments =
employees.stream()
.collect(groupingBy(Employee::getDepartmentName,
averagingDouble(emp -> Double.parseDouble(emp.getSalary()))));
以防万一你想仅使用流直接查找 max avg salary 部门名称
String deptWithMaxAvgSal = employees.stream().collect(
Collectors.groupingBy(Employee::departmentName,
Collectors.averagingDouble(emp->Double.parseDouble(emp.salary())))).entrySet().stream().max(Map.Entry.comparingByValue()).get().getKey();