Estaba aprendiendo a escribir alguna representación lambda como FunctionalInterface . Por lo tanto, para sumar dos números enteros que utilicé:
BiFunction<Integer, Integer, Integer> biFunction = (a, b) -> a + b;
System.out.println(biFunction.apply(10, 60));
Me da la salida 70 . Pero si lo escribo como este
BinaryOperator<Integer, Integer, Integer> binaryOperator = (a, b) -> a + b;
Me sale un error que dice
Número incorrecto de argumentos de tipo: 3; requerido: 1
No es BinaryOperator
un hijo de BinaryFunction
? ¿Cómo puedo mejorar esto?
BinaryOperator
Dado que BinaryOperator
las obras en un solo tipo de operandos y resultado . es decir BinaryOperator<T>
.
No es BinaryOperator un niño de BinaryFunction?
Si. BinaryOperator
lo hace extends BiFunction
. Sin embargo, hacer notar los estados de documentación (formato a la mía):
Esta es una especialización de
BiFunction
para el caso en que los operandos y el resultado son todos del mismo tipo .
La representación completa es:
BinaryOperator<T> extends BiFunction<T,T,T>
por lo tanto, su código deberá trabajar con
BinaryOperator<Integer> binaryOperator = (a, b) -> a + b;
System.out.println(binaryOperator.apply(10, 60));
IntBinaryOperator
Si se supone que se trata de dos números enteros primitivos en la actualidad en su ejemplo ( agregar dos números enteros que he usado ), se puede hacer uso de la IntBinaryOperator
FunctionalInterface como
IntBinaryOperator intBinaryOperator = (a, b) -> a + b;
System.out.println(intBinaryOperator.applyAsInt(10, 60));
Representa una operación en dos
int
operandos -valued y producir un resultado int-valorado. Esta es la especialización tipo primitivo deBinaryOperator
paraint
.
Estoy usando entero, ¿puedo utilizar IntBinaryOperator
Sí, todavía puede usarlo , pero cuenta la representación de laIntBinaryOperator
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);
habría que incurrir en un gasto general de unboxing first
y second
de las primitivas y luego autoboxing la suma como una salida para result
el tipo Integer
.
Nota : Tenga cuidado de utilizar valores nulos de seguridad para elInteger
embargo o de lo contrario es probable que terminar con unNullPointerException
.