如何用Java 8 Stream筛选指定年龄员工并涨薪后返回Employee列表
解决Java Stream处理Employee列表的类型问题
问题分析
你的代码中map(i -> i.getSalary() *3 /2)把Employee对象转换成了Integer(薪资数值),所以最终collect得到的是List<Integer>,而非需求的List<Employee>。要得到正确类型的列表,map操作必须返回Employee类型的对象,而非单独的薪资值。
解决方案
方案1:修改原Employee对象(注意副作用)
如果允许修改原列表中的员工对象(会影响原数据),可以在map中直接修改薪资后返回原对象:
List<Employee> result = el.stream() .filter(emp -> emp.getAge() >= 32) .map(emp -> { emp.setSalary(emp.getSalary() * 3 / 2); // 提升50%薪资 return emp; }) .collect(Collectors.toList());
⚠️ 注意:这种方式会改变原列表中符合条件的员工薪资,因为Java对象是引用传递的。若需保留原数据,不推荐此方案。
方案2:创建新的Employee对象(推荐,无副作用)
通过创建新的Employee实例保存修改后的薪资,不会影响原列表数据,更符合不可变设计原则:
List<Employee> result = el.stream() .filter(emp -> emp.getAge() >= 32) .map(emp -> new Employee( emp.getName(), emp.getAge(), emp.getSalary() * 3 / 2 // 计算新薪资 )) .collect(Collectors.toList());
假设你的Employee类包含全参构造方法。如果没有全参构造,也可通过setter初始化新对象:
List<Employee> result = el.stream() .filter(emp -> emp.getAge() >= 32) .map(emp -> { Employee newEmp = new Employee(); newEmp.setName(emp.getName()); newEmp.setAge(emp.getAge()); newEmp.setSalary(emp.getSalary() * 3 / 2); return newEmp; }) .collect(Collectors.toList());
验证示例
用你提供的示例数据测试:
- 员工B(32岁,3000薪资)会被筛选,薪资变为4500
- 员工C(33岁,5000薪资)会被筛选,薪资变为7500
- 最终
result列表包含这两个修改后的Employee对象,类型为List<Employee>
内容的提问来源于stack exchange,提问作者Abhinaba
相关产品推荐
相关产品推荐

