Разница между бифункциейи бинарный оператор <X> - PullRequest
0 голосов
/ 25 октября 2018

Я не могу понять, почему BinaryOperator<Integer> может быть размещено в месте A в приведенном ниже коде, но не BiFunction<Integer, Integer>?

A foo = (a, b) -> { return a * a + b * b; };
int bar = foo.apply(2, 3);
System.out.println(bar);

Может кто-нибудь, пожалуйста, помогите мнепонять это.

Ответы [ 2 ]

0 голосов
/ 25 мая 2019

Bifunction и BinaryOperator одинаковы, но единственное отличие здесь - это тип аргумента и тип возвращаемого значения интерфейсов.

Рассмотрим случай, когда вы хотите объединить две строки и вернуть результат.В этом случае вы можете выбрать любой из них, но BinaryOperator - хороший выбор, потому что если вы сконцентрируетесь на аргументах и ​​типе возвращаемого значения, они все будут одинаковыми.

BinaryOperator<String> c=(str,str1)->str+str1;

вы можете сделатьто же самое с Bifunction, но теперь мы видим разницу здесь:

BiFunction<String,String,String> c=(str,str1)->str+str1;

Теперь рассмотрим случай, в котором мы хотим добавить два целых числа и вернуть строку.Здесь мы можем выбрать только BiFunction, а не BinaryOperator:

BiFunction<Integer,Integer,String> c=(a,b)->"Answer="+(a+b);
0 голосов
/ 25 октября 2018

BinaryOperator это особый BiFunction.Таким образом, вы можете назначить одно и то же выражение им обоим.Проверьте это.

BinaryOperator<Integer> foo = (a, b) -> {
    return a * a + b * b;
};
BiFunction<Integer, Integer, Integer> barFn = (a, b) -> {
    return a * a + b * b;
};

Если вы посмотрите на исходный код, это будет

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