使用 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));
假设我们有一个 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));