代码之家  ›  专栏  ›  技术社区  ›  skip

双函数<X,X>和二进制运算符<X>之间的差异

  •  -3
  • skip  · 技术社区  · 7 年前

    我不明白为什么会这样 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);
    

    有人能帮我理解一下吗。

    1 回复  |  直到 7 年前
        1
  •  5
  •   Ravindra Ranwala    7 年前

    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.
    }
    
        2
  •  1
  •   Mehrose    7 年前

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

    考虑一个要连接两个字符串并返回结果的情况。在本例中,您可以选择其中一个,但是BinaryOperator是一个很好的选择,因为如果您关注参数和返回类型,它们都是相同的。

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

    您可以对双功能执行相同的操作,但现在可以在这里看到区别:

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

    现在考虑一个要添加两个整数并返回字符串的情况。这里我们只能选择双函数,不能选择二进制运算符:

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