gpt4 book ai didi

Java8 Groupby 字段和收集对象

转载 作者:行者123 更新时间:2023-11-30 06:04:22 24 4
gpt4 key购买 nike

假设我有以下类型的列表:

List<Employee> employees = ....

哪里

class Employee{
private String employeeId;
private String employeeName;

@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Employee employee = (Employee) o;
return Objects.equals(employeeId, employee.employeeId);
}

@Override
public int hashCode() {
return Objects.hash(employeeId);
}
}

以下代码给出了每个员工的姓名及其频率:

Map<String,Long> employeeNameWithFreq = employees
.stream()
.collect(Collectors.groupingBy(
Employee::getEmployeeName,
Collectors.counting()));

如何groupBy在Java8流领域employeeName字段并获取对应的Employee对象作为输出映射中的键和频率作为它的值?我的意思是输出应该是 Map<Employee,Long> 类型

注意:equals() & hashcode()字段 employeeId 的方法已被覆盖,所以不能使用它们。基本上寻找一个可以将比较字段作为参数传递的解决方案。

最佳答案

我不确定这是否是真正的目标,但根据您的问题,您可能希望将 TreeMap 与自定义 Comparator 一起使用,它将比较 Employee仅通过某些选定字段(如此处的name)来对象。

演示

TreeMap<Employee, Long> map = Stream.
of( new Employee(1, "Adam"),
new Employee(2, "Thomas"),
new Employee(3, "Adam")
).collect(Collectors.groupingBy(
Function.identity(),
() -> new TreeMap<>(Comparator.comparing(Employee::getName)),
Collectors.counting())
);

System.out.println(map.get(new Employee(33, "Adam"))); // Output: 2
// ID will be ignored by Comparator ---^^

关于Java8 Groupby 字段和收集对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51668570/

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