Reduce无法推断合适方法版本,如何指定目标方法版本?
解决Stream.reduce方法重载推断失败的问题
你的代码存在两个核心问题,导致reduce方法无法正确推断重载版本:
- map操作错误:你直接将
Supplier对象传入map,而没有调用其get()方法获取实际的BigDecimal值,导致流的元素类型变为Stream<Supplier<? extends BigDecimal>>,与reduce期望的Stream<BigDecimal>不匹配。 - 泛型通配符导致的推断模糊:
Supplier<? extends BigDecimal>的通配符使得编译器无法明确BigDecimal::add方法引用对应的具体重载。
修复方案
方案1:修正map调用并使用Lambda替代方法引用
直接用Lambda表达式明确参数类型,避免编译器推断歧义:
public BigDecimal methodCalculate(List<MyObject> list, Supplier<? extends BigDecimal> getValue) { BigDecimal sum = list.stream() .filter(item -> item.getPremium()) .map(item -> getValue.get()) // 调用get()获取BigDecimal实例 .reduce(BigDecimal.ZERO, (a, b) -> a.add(b)); return sum; }
方案2:调整Supplier泛型为具体类型
如果业务允许,将Supplier的泛型从? extends BigDecimal改为BigDecimal,编译器就能正常推断方法引用:
public BigDecimal methodCalculate(List<MyObject> list, Supplier<BigDecimal> getValue) { BigDecimal sum = list.stream() .filter(item -> item.getPremium()) .map(item -> getValue.get()) .reduce(BigDecimal.ZERO, BigDecimal::add); return sum; }
方案3:显式指定方法引用的类型参数
通过显式指定BigDecimal::add的类型参数,消除推断歧义:
public BigDecimal methodCalculate(List<MyObject> list, Supplier<? extends BigDecimal> getValue) { BigDecimal sum = list.stream() .filter(item -> item.getPremium()) .map(item -> getValue.get()) .reduce(BigDecimal.ZERO, BigDecimal::<BigDecimal>add); // 显式指定类型 return sum; }
内容的提问来源于stack exchange,提问作者phantom_wizard
相关产品推荐
相关产品推荐

