BigDecimal#min 方法是否有资格成为二进制运算符?

2022-09-03 18:34:57

该方法将 a 作为参数。的函数签名是 。该方法在其方法签名中只有 1 个参数(即。 ).Stream.reduceBinaryOperatorBinaryOperator(T,T) -> TBigDecimal::min(T) -> T

为什么编译器在我传递到方法时不抱怨?BigDecimal::minStream.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);

谢谢。


答案 1

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

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

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

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

当你有这样的东西时,事情会更有趣IMO:

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

然后你可以这样写:

  TriFunction<Test, Integer, Integer, Test> f = Test::copy;

  TriFunction<Test, Integer, Integer, Test> f2 = 
           (test, i, j) -> test.copy(i, j);

答案 2

因为 是实例方法。Javac足够聪明,可以把它变成一个如果你使用.传递给结果的第一个参数将是实例,第二个参数将是 的参数(尽管在 的情况下,要求顺序可以反转)。这将是如果你使用类似的东西。BigDecimal::min(T, T) -> TBigDecimal::minBinaryOperatorminBinaryOperator(T) -> Tnew BigInteger(1)::min


推荐