使用 Java 8 个流查找薪水相同的员工

Find Employees with same salary using Java 8 Streams

假设我们有一个 Employee 对象列表 { id, name, salary} 。 如何找到薪水相同的员工? 使用 Java 8 Stream API ..

我试过的:- 我想这是询问如何“根据”薪水列出员工的间接方式,在这种情况下我们可以 groupBy 薪水。但这将显示所有薪水和具有该薪水的员工列表。

问题:如何从这个大地图中只列出薪水相同的员工?

我试过的解决方法::

List<Employee> employees = new ArrayList<>();

        employees.add(new Employee(1, "John" , 1000));
        employees.add(new Employee(1, "Peter" , 2000));
        employees.add(new Employee(1, "Ben" , 3000));
        employees.add(new Employee(1, "Steve" , 2000));
        employees.add(new Employee(1, "Parker" , 1000));

Map<Integer, Set<String>> map3 =  employees.stream()
                .collect(Collectors.groupingBy
                        (Employee::getSalary, Collectors.mapping
                                (Employee::getName, Collectors.toSet())));

输出

map3 :: {2000=[史蒂夫、彼得]、3000=[本]、1000=[帕克、约翰]}


public class Employee {

public Employee(int id, String name, int salary) {
    this.id = id;
    this.name = name;
    this.salary = salary;
}

private int id;
private String name;
private int salary;

public int getId() {
    return id;
}

public void setId(int id) {
    this.id = id;
}

public String getName() {
    return name;
}

public void setName(String name) {
    this.name = name;
}

public int getSalary() {
    return salary;
}

public void setSalary(int salary) {
    this.salary = salary;
}

}

想出下面的解决方案,它使用已经编码的groupBy,然后对大小进行条件检查。

 map3.forEach((k,v) -> {
            if(v.size()>1) {
                System.out.println("salary :: "+ k + " is same for " + v);
            }
        });

或使用 filter ,避免 if 条件检查..

  map3.entrySet()
            .stream().filter(e -> e.getValue().size()>1)
            .forEach((e) -> System.out.println( "Salary :: " + 
                        e.getKey() + " is same for " + e.getValue()));

输出

[Steve, Peter] 的工资 :: 2000 相同

薪水 :: 1000 与 [Parker, John] 相同

您也可以像这样使用过滤器:

employees.stream().collect(Collectors.groupingBy(Employee::getSalary)).entrySet()
            .stream()
            .filter(entry -> entry.getValue().size() > 1)
            .map(entry -> new AbstractMap.SimpleEntry<>(entry.getKey(),
                    entry.getValue()
                 .stream().map(Employee::getName).collect(Collectors.toSet())))
            .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue));