我应该使用哪个 FunctionalInterface?

Which FunctionalInterface should I use?

我正在学习将一些 lambda 表示形式写成 FunctionalInterface。 因此,要添加我使用的两个整数:

BiFunction<Integer, Integer, Integer> biFunction = (a, b) -> a + b;
System.out.println(biFunction.apply(10, 60));

给我输出 70。但是如果我这样写

BinaryOperator<Integer, Integer, Integer> binaryOperator = (a, b) -> a + b;

我收到一条错误消息

Wrong number of type arguments: 3; required: 1

BinaryOperator 不是 BinaryFunction 的 child 吗?我该如何改进它?

BinaryOperator

因为 BinaryOperator 处理 单一类型的操作数和结果 。即 BinaryOperator<T>.

Isn't BinaryOperator a child of BinaryFunction?

是的。 BinaryOperator 确实 extends BiFunction。 但请注意文档状态(格式化我的):

This is a specialization of BiFunction for the case where the operands and the result are all of the same type.

完整表示如下:

BinaryOperator<T> extends BiFunction<T,T,T>

因此您的代码将适用于

BinaryOperator<Integer> binaryOperator = (a, b) -> a + b;
System.out.println(binaryOperator.apply(10, 60));

IntBinaryOperator

如果您应该像当前示例中那样处理两个原始整数(添加我使用的两个整数),您可以使用 IntBinaryOperator FunctionalInterface 作为

IntBinaryOperator intBinaryOperator = (a, b) -> a + b;
System.out.println(intBinaryOperator.applyAsInt(10, 60));

Represents an operation upon two int-valued operands and producing an int-valued result. This is the primitive type specialization of BinaryOperator for int.


I am using Integer, can I still use IntBinaryOperator

是的,你仍然可以使用它但是注意IntBinaryOperator

的表示
Integer first = 10;
Integer second = 60;
IntBinaryOperator intBinaryOperator = new IntBinaryOperator() {
    @Override
    public int applyAsInt(int a, int b) {
        return Integer.sum(a, b);
    }
};
Integer result = intBinaryOperator.applyAsInt(first, second); 

会给你带来拆箱firstsecond到基元的开销,然后自动装箱总和作为类型 Integer.

result 的输出

注意:小心使用 空安全值 Integer 不过,否则你可能会得到 NullPointerException.

Isn't BinaryOperator a child of BinaryFunction?

是的,是的。如果您查看 BinaryOperator 的源代码,您会看到:

public interface BinaryOperator<T> extends BiFunction<T,T,T> {
    // ...
}

所以你只需要修正你的语法:

BinaryOperator<Integer> binaryOperator = (a, b) -> a + b;
System.out.println(binaryOperator.apply(10, 60));

How do I improve it?

您可以使用 IntBinaryOperator。它进一步简化了语法:

IntBinaryOperator binaryOperator = (a, b) -> a + b;
System.out.println(binaryOperator.applyAsInt(10, 60));
BiFunction<Integer, Integer, Integer> biFunction = (a, b) -> a + b;

可以表示为

BinaryOperator<Integer> binaryOperator = (a, b) -> a + b;

但通常您想对 int 而不是 Integer 执行算术计算,以避免拆箱计算(整数到整数)并再次装箱到 return 结果(整数到整数):

IntBinaryOperator intBinaryOperator = (a, b) -> a + b;

附带说明一下,您还可以使用方法引用而不是 lambda 来计算两个 int 之间的总和。
Integer.sum(int a, int b) 是您要查找的内容:

IntBinaryOperator biFunction = Integer::sum;