在Java8中提供了许多函数接口,如UnaryOperator、BinaryOperator和Function等。
《守则》
UnaryOperator<Integer> uOp = (Integer i) -> i * 10;
BinaryOperator<Integer> bOp = (Integer i1, Integer i2) -> i1 * i2 * 10;可以总是使用下面的函数来编写,
Function<Integer, Integer> f1 = (Integer i) -> i * 10;
BiFunction<Integer, Integer, Integer> f2 = (Integer i1, Integer i2) -> i1 * i2 * 10;那么,这些操作员接口有什么用呢?他们是否实现了与使用Function所能实现的不同的东西?
发布于 2019-01-30 21:34:51
发布于 2019-01-30 21:47:48
功能接口应该尽可能专门化。
拥有
Function<Integer, Integer> f1 = (Integer i) -> i * 10;而不是:
UnaryOperator<Integer> uop1 = (Integer i) -> i * 10;实际上是一种代码气味(也有Sonar Rule squid:S4276用于此目的)。
原因很简单,因为创建这些接口是为了避免在只有一个类型参数时传递不必要的类型参数n次。
public interface UnaryOperator<T> extends Function<T, T>所以写一个Function<T, T>是很长的,也是不必要的。
谈到其他接口,如:IntConsumer与Consumer<Integer>或DoubleToIntFunction与Function<Double, Integer>,其中第二种选择可能导致不必要的自动装箱,并可能降低性能。
因此,这就是为什么使用更具体和适当的接口使您的代码看起来更干净,并使您远离意外的原因。
发布于 2019-01-30 21:39:01
是的,它们在功能上是相同的。它们甚至扩展了您正在讨论的类,并使用相同的SAM。UnaryOperator和BinaryOperator接口仅定义静态方法。
public interface UnaryOperator<T> extends Function<T, T>
public interface BinaryOperator<T> extends BiFunction<T,T,T>它们只是为了简洁。既然一个类型参数可以指定一次,为什么还要指定两三次呢?
https://stackoverflow.com/questions/54441751
复制相似问题