如何使用Java Stream获取薪资大于特定值的员工姓名列表
修正Java Stream类型不匹配问题,实现筛选并收集员工姓名
你的代码出现类型不匹配的核心原因很明确:你直接收集了Employee对象,但目标变量是List<String>类型。
来看具体问题:elist.stream().filter(...)返回的是Stream<Employee>,直接调用Collectors.toList()会得到List<Employee>,但你把它赋值给了List<String>类型的ename,编译器自然会报错。
修正方案:添加map操作转换类型
我们需要在筛选之后,把每个Employee对象转换成它的姓名(String类型),这样Stream的类型就变成Stream<String>,再收集就能得到符合要求的List<String>了。
修正后的完整代码如下:
import java.util.ArrayList; import java.util.List; import java.util.stream.Collectors; public class EmployeeDemo { public static void main(String[] args) { List<Employee> elist = new ArrayList<>(); Employee e1 = new Employee("kaustubh", 1001234123); Employee e2 = new Employee("kaustubh2", 100); Employee e3 = new Employee("kaustubh3", 10055); Employee e4 = new Employee("kaustubh4", 100234); Employee e5 = new Employee("kaustubh5", 10054); elist.add(e5); elist.add(e2); elist.add(e3); elist.add(e4); elist.add(e1); // 修正后的核心代码 List<String> ename = elist.stream() // 筛选薪资大于10054的员工(注意确认Employee类的薪资getter方法名) .filter(employee -> employee.getEmpSalary() > 10054) // 将Employee对象映射为对应的姓名,转换为Stream<String> .map(Employee::getEmpName) // 收集为List<String> .collect(Collectors.toList()); } } // 假设你的Employee类定义如下(补充完整getter方法) class Employee { private String empName; private long empSalary; public Employee(String empName, long empSalary) { this.empName = empName; this.empSalary = empSalary; } public String getEmpName() { return empName; } public long getEmpSalary() { return empSalary; } }
关键步骤解释:
filter(employee -> employee.getEmpSalary() > 10054):保留薪资大于10054的员工对象;map(Employee::getEmpName):使用方法引用,把每个Employee对象提取出empName属性,将Stream<Employee>转换为Stream<String>;collect(Collectors.toList()):把Stream<String>最终收集成List<String>,完美匹配目标变量的类型。
另外注意:你的原代码里写了i.getSalary(),但Employee类的属性是empSalary,所以要确保getter方法名是getEmpSalary()(如果你的类里确实是getSalary(),那改成对应的即可),否则会编译报错。
内容的提问来源于stack exchange,提问作者Katty
相关产品推荐
相关产品推荐

