如果使用 java 8 在列表中的一组中找到多于 1 条记录,则修改对象列表之一的属性

问题描述 投票:0回答:2

我的 Employee 类有 3 个字段。

我有一个 DTO 对象列表。

`public class Employee {
   private String empId;
   private String name;
   private String group;
   private String salary;
   private String incentive;         
}`

`List<Employee> listEmployees = new ArrayList<>(List.of(
 new Employee("101"."Mark", "A", 20000, 10),
 new Employee("102"."Tom", "B", 3000, 15),
 new Employee("103"."Travis", "C", 5000, 12),
 new Employee("104"."Diana", "D", 3500, 11),
 new Employee("105"."Keith", "B", 4200, 15),
 new Employee("106"."Liam", "D", 6500, 11),
 new Employee("107"."Whitney", "B", 6100, 15),
 new Employee("108"."Tina", "B",2900, 15)
 new Employee("109"."Patrick", "D", 3400, 11)
 ));`

如果一个组中有多于一名员工,我想修改同一组中所有员工的5%激励。例如,对于上面的示例,员工组 B & D 列表中有不止一名员工,因此在这种情况下,我想将同一组中所有员工的激励修改为 5%。但组 A 和 C 只有一名员工,所以我不会对该员工进行任何修改。

例如,任何公司决定每年对员工进行激励,但如果某个部门的员工数量超过特定数量(例如 100),他们希望更新同一部门所有员工的激励值。但其他有特定员工数量((例如100))的部门较少,因此激励措施不会改变。

我尝试过,例如:

employeeList.stream() .collect(Collectors.groupingBy(Employee::group));

所以我的结果如下所示。 (只有A和C不需要修改,因为该组只有一条记录)

`Employee("101"."Mark", "A", 20000, 10)
 Employee("102"."Tom", "B", 3000, 5),
 Employee("103"."Travis", "C", 5000, 12),
 Employee("104"."Diana", "D", 3500, 5),
 Employee("105"."Keith", "B", 4200, 5),
 Employee("106"."Liam", "D", 6500, 5),
 Employee("107"."Whitney", "B", 6100, 5),
 Employee("108"."Tina", "B",2900, 5)
 Employee("109"."Patrick", "D", 3400, 5)`
java java-stream collectors
2个回答
2
投票

您可以先使用

Collectors.groupingBy
获取计数,然后基于此创建新的
List

Map<String, Long> groupFreq = listEmployees.stream().collect(Collectors.groupingBy(Employee::group, Collectors.counting()));
List<Employee> result = listEmployees.stream().map(e -> {
    if (groupFreq.get(e.group()) > 1) 
        return new Employee(e.empId(), e.name(), e.group(), e.salary(), 5);
    return e;
}).collect(Collectors.toList()); // or .toList() in Java 16+

0
投票
 List<Employee> empList = listEmployees.stream()
            .collect(Collectors.groupingBy(Employee::getGroup))
            .entrySet()
            .stream()
            .filter(v -> v.getValue().size() > 1)
            .map(v -> v.getValue())
            .flatMap(List::stream)
            .map(e -> {
return new Employee(e.getEmpId(), e.getName(), e.getGroup(), e.getSalary(), 5);
            })
            .collect(Collectors.toList());
© www.soinside.com 2019 - 2024. All rights reserved.