首页 > 解决方案 > 我应该使用哪个功能接口?

问题描述

我正在学习编写一些 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;

我收到一条错误消息

类型参数数量错误:3;要求:1

BinaryOperator孩子不是BinaryFunction吗?我该如何改进它?

标签: javajava-8functional-interface

解决方案


BinaryOperator

由于BinaryOperator适用于单一类型的操作数和结果。即BinaryOperator<T>

BinaryOperator 不是 BinaryFunction 的孩子吗?

是的。BinaryOperator确实extends BiFunction。但请注意文档状态(格式化我的):

这是BiFunction针对 操作数和结果都是相同类型的情况的特化。

完整的表示如下:

BinaryOperator<T> extends BiFunction<T,T,T>

因此您的代码应与

BinaryOperator<Integer> binaryOperator = (a, b) -> a + b;
System.out.println(binaryOperator.apply(10, 60));

整数二元运算符

如果您应该像当前示例中那样处理两个原始整数(添加我使用的两个整数),则可以将IntBinaryOperatorFunctionalInterface 用作

IntBinaryOperator intBinaryOperator = (a, b) -> a + b;
System.out.println(intBinaryOperator.applyAsInt(10, 60));

表示对两个int值操作数的操作并产生一个 int 值结果。这是 for 的原始类型特化 。BinaryOperatorint


我正在使用 Integer,我还能使用 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); 

会招致拆箱 firstsecond原语的开销,然后将总和自动装箱result作为type的输出Integer

注意:小心使用null 安全值Integer否则您可能会以NullPointerException.


推荐阅读