起作用的原因:具有Reduce和BigDecimal :: add

时间:2018-12-31 03:32:55

标签: java lambda java-8 java-stream functional-interface

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

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);
    }
}

2 个答案:

答案 0 :(得分:8)

它在您当前的上下文中用作 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

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

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

答案 1 :(得分:4)

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

如您所知,第一个可能的签名将是两个参数的静态方法。相关的lambda将为(a, b) -> BigDecimal.add(a, b)。当然,您正确地认识到它不存在。

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