它的工作原理:BigDecimal Sum with Reduce和BigDecimal :: add

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了它的工作原理:BigDecimal Sum with Reduce和BigDecimal :: add相关的知识,希望对你有一定的参考价值。

我可以理解为什么计算Total1,但是当计算Total2时我不知道!如何在BiFunction中使用BigDecimal :: add?签名不一样!!!

package br.com.jorge.java8.streams.bigdecimal;

import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.List;

public class BigDecimalSumTest {
    public static void main(String[] args) {

        List<BigDecimal> list = new ArrayList<>();

        list.add(new BigDecimal("1"));
        list.add(new BigDecimal("2"));

        BigDecimal total1 = list.stream().reduce(BigDecimal.ZERO, (t, v) -> t.add(v));

        BigDecimal total2 = list.stream().reduce(BigDecimal.ZERO, BigDecimal::add);

        System.out.println("Total 1: " + total1);
        System.out.println("Total 2: " + total2);
    }
}
答案

鉴于BigDecimal::add被用作BiFunction<BigDecimal, BigDecimal, BigDecimal>,编译器将寻找两个符合条件的签名之一。

正如您所了解的那样,第一个可能的签名将是一个双参数静态方法。相关的lambda将是(a, b) -> BigDecimal.add(a, b)。当然,你是正确的认识到这不存在。

第二种可能的签名是单参数实例方法。这里的等效lambda将是(a, b) -> a.add(b)。由于这个存在而另一个不存在,这就是编译器解释它的方式。

另一答案

它在你目前的背景下用作BinaryOperator<T>

它的等效lambda表示:

(bigDecimal, augend) -> bigDecimal.add(augend) // same as in your previous line of code

和匿名类表示:

new BinaryOperator<BigDecimal>() {
    @Override
    public BigDecimal apply(BigDecimal bigDecimal, BigDecimal augend) {
        return bigDecimal.add(augend);
    }
}

其中BinaryOperator<T> extends BiFunction<T,T,T>,意思是它的操作数和结果都是相同类型的BiFunction的特化。

除此之外,您的代码实际上正在使用reduce方法的重载实现之一,即Stream.reduce(T identity, BinaryOperator<T> accumulator)


如何在BiFunction中使用BigDecimal :: add

更进一步,仅用于解释,还有一个重载实现,使用combiner,如Stream.reduce​(U identity, BiFunction<U,​? super T,​U> accumulator, BinaryOperator<U> combiner),它看起来像:

BigDecimal total = list.stream()
                       .reduce(BigDecimal.ZERO, BigDecimal::add, BigDecimal::add);
//                                                   ^^                ^^
//                                              BiFunction here    BinaryOperator here

以上是关于它的工作原理:BigDecimal Sum with Reduce和BigDecimal :: add的主要内容,如果未能解决你的问题,请参考以下文章

Excel - UDF 函数,用于根据条件从多个工作表中获取 SUM 值

[java基础原理] BigDecimal

stream流运算:求和(基本数据类型,BigDecimal),多字段乘积求和,提取对象属性集合

Wit.ai 与 Facebook Messenger 的集成

如何打印格式化的 BigDecimal 值?

Java中Bigdecimal的使用和注意事項