我应该使用哪个 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);
会给你带来拆箱first
和second
到基元的开销,然后自动装箱总和作为类型 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;
我正在学习将一些 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 ofBinaryOperator
forint
.
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);
会给你带来拆箱first
和second
到基元的开销,然后自动装箱总和作为类型 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;