java - 我应该使用哪个功能接口?
问题描述
我正在学习编写一些 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
吗?我该如何改进它?
解决方案
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));
整数二元运算符
如果您应该像当前示例中那样处理两个原始整数(添加我使用的两个整数),则可以将IntBinaryOperator
FunctionalInterface 用作
IntBinaryOperator intBinaryOperator = (a, b) -> a + b;
System.out.println(intBinaryOperator.applyAsInt(10, 60));
表示对两个
int
值操作数的操作并产生一个 int 值结果。这是 for 的原始类型特化 。BinaryOperator
int
我正在使用 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);
会招致拆箱 first
和second
原语的开销,然后将总和自动装箱result
作为type的输出Integer
。
注意:小心使用null 安全值,Integer
否则您可能会以NullPointerException
.
推荐阅读
- python-3.x - 获取 Seaborn 传奇位置
- node.js - NPM 安装抛出未找到模块错误
- spring-boot - 如何使用 Spring Boot 使复合外键成为复合主键的一部分 - JPA
- angular - 在ngrx效果中基于ID循环遍历对象数组
- python - Django:信号不会自动不为用户创建属性
- python - pySHACL:未能报告验证错误
- javascript - 无法在“节点”上执行“附加孩子”:参数 1 不是“节点”类型
- java - 在 Android 中向 urlConnection 添加标头
- mongodb - MongoDB - 如果字段之一在数组对象中,如何检查两个字段是否具有相同的值
- node.js - 抓取网站在 Node.JS 中返回意外的空值