gpt4 book ai didi

java - Reduce 无法推断正确的方法版本

转载 作者:行者123 更新时间:2023-12-02 18:05:30 25 4
gpt4 key购买 nike

我想让我的代码更加通用。为了实现这一点,我证明了列表和供应商都是方法参数。

事实证明,在有多个可供选择的情况下,reduce() 无法推断出具体方法(见下面的屏幕截图)。

如何声明我想要使用的方法版本?

public BigDecimal methodCalculate(List<MyObject> list, Supplier<? extends BigDecimal> getValue) {
BigDecimal sum = list.stream()
.filter(item -> item.getPremium())
.map(item -> getValue)
.reduce(BigDecimal.ZERO, BigDecimal::add);
return sum;
}

enter image description here

最佳答案

我在代码中看到两个问题:

  • map操作创建 Supplier 的流, BigDecimal 。也许您的意图是使用供应商:
.map(item -> getValue.get())
  • 您的Supplier类型为Supplier<? extends BigDecimal>因此,通过上述修复,您将拥有一个流 Stream<? extends BigDecimal>不是Stream<BigDecimal> .

注意:无需执行任何特殊操作即可让编译器解析方法引用 BigDecimal::add因为 add() 只有一个重载版本根据参数数量适用。此引用应归类为对特定对象的实例方法的引用,因为它代表 BinaryOperator<BigDecimal> 的实现,它需要两个 BigDecimal 类型的参数,即该方法将在运算符的第一个参数上调用,第二个参数将用作参数。而且 add() 只有一个版本期待一个参数,add() 的味道这需要 MathContext作为附加参数,此处不适用(有关方法引用的更多信息,see )。

但是虽然方法 add()可以通过 BigDecimal假设子类型进行访问并且编译器能够解析 add() 所需的版本该代码无法编译。

reduce的味道 reduce(identity,accumulator) 应该具有与流中的元素类型完全相同的返回类型(与身份类型相同)。但基于提供的身份返回类型 reduce将是BigDecimal ,同时在流中我们有 ? extends BigDecimal 。这会导致编译错误。

我们可以通过将供应商类型更改为 Supplier<BigDecimal> 来解决这两个要点。 ,因为 BigDecimal 没有子类型在JDK中:

public BigDecimal methodCalculate(List<MyObject> list,
Supplier<BigDecimal> getValue) {

return list.stream()
.filter(item -> item.getPremium())
.map(item -> getValue.get())
.reduce(BigDecimal.ZERO, BigDecimal::add);
}

如果您无法更改供应商的类型,那么您需要 reduce(identity,accumulator,combiner) 的另一种风格。 ,它能够具有与流中的元素类型不同的身份(即返回类型):

public BigDecimal methodCalculate(List<MyObject> list,
Supplier<? extends BigDecimal> getValue) {

return list.stream()
.filter(item -> item.getPremium())
.map(item -> getValue.get())
.reduce(BigDecimal.ZERO, BigDecimal::add, BigDecimal::add);
}

关于java - Reduce 无法推断正确的方法版本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/73375164/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com