首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >工作原理: BigDecimal和Reduce和BigDecimal::add

工作原理: BigDecimal和Reduce和BigDecimal::add
EN

Stack Overflow用户
提问于 2018-12-31 03:32:54
回答 2查看 1.3K关注 0票数 6

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

代码语言:javascript
复制
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);
    }
}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-12-31 03:38:53

它在当前上下文中用作BinaryOperator

其对应的lambda表示:

代码语言:javascript
复制
(bigDecimal, augend) -> bigDecimal.add(augend) // same as in your previous line of code

和匿名类表示:

代码语言:javascript
复制
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 accumulator)

如何在BiFunction中使用BigDecimal::add

只需进一步解释一下,还有一个重载的实现使用combiner,就像在Stream.reduce​(U identity, BiFunction accumulator, BinaryOperator combiner)中一样,如下所示:

代码语言:javascript
复制
BigDecimal total = list.stream()
                       .reduce(BigDecimal.ZERO, BigDecimal::add, BigDecimal::add);
//                                                   ^^                ^^
//                                              BiFunction here    BinaryOperator here
票数 9
EN

Stack Overflow用户

发布于 2018-12-31 03:46:10

考虑到BigDecimal::add被用作BiFunction<BigDecimal, BigDecimal, BigDecimal>,编译器将查找两个合格签名中的一个。

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

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

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53983334

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档