Java Stream Collectors.reducing类型推断失败问题排查与修复
按性别统计员工总收入的编译错误分析与修复
错误原因
你写的代码里,Collectors.reducing的第一个参数用了int类型的0,但Employee的income是double类型(对应包装类Double)。reducing的三参数版本要求初始值的类型、映射函数(Employee::getIncome)的返回值类型、以及累加器(Double::sum)的类型必须完全一致。这里int类型的0和Double类型的收入值类型不兼容,编译器无法推断出统一的类型参数U,因此抛出了类型不匹配的编译错误。
修复方法
方法一:修正初始值类型
把初始值从0改成0.0(Double类型),让三个参数的类型统一:
Map<Employee.Gender, Double> totalIncomeByGender = Employee.persons().stream() .collect(Collectors.groupingBy( Employee::getGender, Collectors.reducing(0.0, Employee::getIncome, Double::sum) ));
方法二:使用更简洁的求和收集器
既然是对double类型的值求和,直接用Collectors.summingDouble会更直观,从根源避免reducing的类型匹配问题:
Map<Employee.Gender, Double> totalIncomeByGender = Employee.persons().stream() .collect(Collectors.groupingBy( Employee::getGender, Collectors.summingDouble(Employee::getIncome) ));
方法三:使用toMap收集器(可选)
也可以用Collectors.toMap实现相同逻辑,代码同样清晰:
Map<Employee.Gender, Double> totalIncomeByGender = Employee.persons().stream() .collect(Collectors.toMap( Employee::getGender, Employee::getIncome, Double::sum ));
内容的提问来源于stack exchange,提问作者Pranjal
相关产品推荐
相关产品推荐

