You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.20 11:54:27