BigDecimal #min方法是否有资格作为BinaryOperator?

时间:2017-03-31 08:51:13

标签: java java-8 java-stream

Stream.reduce方法以BinaryOperator为参数。 BinaryOperator的函数签名是(T,T) -> TBigDecimal::min方法在其方法签名中只有一个参数(即(T) -> T)。

当我将BigDecimal::min传递给Stream.reduce方法时,为什么编译器不抱怨?

示例代码:

List<BigDecimal> bigDecimalList = new ArrayList<>();
        bigDecimalList.add(BigDecimal.valueOf(1));
        bigDecimalList.add(BigDecimal.valueOf(2));
        bigDecimalList.add(BigDecimal.valueOf(3));
BigDecimal minResult = bigDecimalList.stream().reduce(BigDecimal::min).orElse(BigDecimal.ZERO);

感谢。

2 个答案:

答案 0 :(得分:19)

这实际上称为对特定类型的任意对象的实例方法的引用。

编译器将调用实例作为第一个参数,因此它们是等价的:

cat file\ name\(1\).zip | hadoop fs -put - "/tmp/one/file name(1).zip"

当你有这样的事情时,事情会变得非常有趣:

    BinaryOperator<BigDecimal> b = (left, right) -> left.min(right);

    BinaryOperator<BigDecimal> b2 = BigDecimal::min;
    b2.apply(left, right);

和理论课:

@FunctionalInterface
interface TriFunction<A, B, C, R> {

    R apply(A a, B b, C c);

}

然后你可以这样写:

class Test {

    int x;

    int y;

    public Test(int x, int y) {
        this.x = x;
        this.y = y;
    }

    public Test copy(int n, int m) {
        return new Test(m, n);
    }
}

答案 1 :(得分:8)

因为BigDecimal::min是一个实例方法。如果您使用(T, T) -> T,Javac足够聪明,可以将其变为BigDecimal::min。传递给结果BinaryOperator的第一个参数将是实例,第二个参数将是min的参数(尽管在BinaryOperator的情况下需要订单可以被逆转)。如果您使用类似(T) -> T的内容,则会new BigInteger(1)::min