首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在Java 8中有函数时一元运算符和二进制运算符的使用

在Java 8中有函数时一元运算符和二进制运算符的使用
EN

Stack Overflow用户
提问于 2019-01-30 21:30:48
回答 4查看 1.6K关注 0票数 4

在Java8中提供了许多函数接口,如UnaryOperator、BinaryOperator和Function等。

《守则》

代码语言:javascript
复制
UnaryOperator<Integer> uOp = (Integer i) -> i * 10;
BinaryOperator<Integer> bOp = (Integer i1, Integer i2) -> i1 * i2 * 10;

可以总是使用下面的函数来编写,

代码语言:javascript
复制
Function<Integer, Integer> f1 = (Integer i) -> i * 10;
BiFunction<Integer, Integer, Integer> f2 = (Integer i1, Integer i2) -> i1 * i2 * 10;

那么,这些操作员接口有什么用呢?他们是否实现了与使用Function所能实现的不同的东西?

EN

回答 4

Stack Overflow用户

发布于 2019-01-30 21:34:51

他们来这里是为了您的方便。您可以不用编写BiFunction<Integer, Integer, Integer>,只需编写/使用BinaryOperator<Integer>即可。另一个好处是:您可以确保提供给您的函数接受1到2个相同类型的参数,并在不需要编写太多代码的情况下完全返回该类型。

此外,由于BinaryOperator<T>的性质,将minBymaxBy放在其中更有意义,而放入BiFunction<T, U, R>并没有多大意义。由于给定的参数具有相同的类型,并且保证返回类型也是相同的,因此可以很容易地使用比较器。非常方便。

票数 4
EN

Stack Overflow用户

发布于 2019-01-30 21:47:48

功能接口应该尽可能专门化。

拥有

代码语言:javascript
复制
Function<Integer, Integer> f1 = (Integer i) -> i * 10;

而不是:

代码语言:javascript
复制
UnaryOperator<Integer> uop1 = (Integer i) -> i * 10;

实际上是一种代码气味(也有Sonar Rule squid:S4276用于此目的)。

原因很简单,因为创建这些接口是为了避免在只有一个类型参数时传递不必要的类型参数n次。

代码语言:javascript
复制
public interface UnaryOperator<T> extends Function<T, T>

所以写一个Function<T, T>是很长的,也是不必要的。

谈到其他接口,如:IntConsumerConsumer<Integer>DoubleToIntFunctionFunction<Double, Integer>,其中第二种选择可能导致不必要的自动装箱,并可能降低性能。

因此,这就是为什么使用更具体和适当的接口使您的代码看起来更干净,并使您远离意外的原因。

票数 4
EN

Stack Overflow用户

发布于 2019-01-30 21:39:01

是的,它们在功能上是相同的。它们甚至扩展了您正在讨论的类,并使用相同的SAMUnaryOperatorBinaryOperator接口仅定义静态方法。

代码语言:javascript
复制
public interface UnaryOperator<T> extends Function<T, T>

public interface BinaryOperator<T> extends BiFunction<T,T,T>

它们只是为了简洁。既然一个类型参数可以指定一次,为什么还要指定两三次呢?

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54441751

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档