BiFunction<X, X> 和 BinaryOperator<X> 的区别

Difference between BiFunction<X, X> and BinaryOperator<X>

我无法理解为什么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);

谁能帮我理解一下。

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.
}

Bifunction 和 BinaryOperator 相同,但这里唯一的区别是参数类型和 return 接口类型。

考虑您要连接两个字符串和 return 结果的情况。在这种情况下,您可以选择其中之一,但 BinaryOperator 是一个不错的选择,因为如果您关注参数和 return 类型,它们都是相同的。

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

您可以对 Bifunction 执行相同的操作,但现在可以在此处查看不同之处:

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

现在考虑我们要添加两个整数和 return 一个字符串的情况。这里只能选择BiFunction,不能选择BinaryOperator:

BiFunction<Integer,Integer,String> c=(a,b)->"Answer="+(a+b);