[英]Use of Unaryoperator and Binaryoperator when I have Function in Java 8
在 Java 8 中,提供了许多函数式接口,例如 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 可以实现的不同?
他们在这里是为了您的方便。 你可以BiFunction<Integer, Integer, Integer>
写BiFunction<Integer, Integer, Integer>
而只是写/使用BinaryOperator<Integer>
代替。 一个额外的好处:您可以确保提供给您的函数接受 1 或两个相同类型的参数并准确返回该类型,而无需进行更多的编写。
此外,由于BinaryOperator<T>
的性质,将minBy
和maxBy
类的东西maxBy
那里更有意义,而将其放入BiFunction<T, U, R>
并没有多大意义。 由于给定参数的类型相同,并且返回类型也保证相同,因此可以轻松应用比较器......非常方便。
功能接口应该尽可能地专业化。
拥有
Function<Integer, Integer> f1 = (Integer i) -> i * 10;
代替:
UnaryOperator<Integer> uop1 = (Integer i) -> i * 10;
实际上是一种代码气味(为此也有声纳规则squid:S4276
)。
原因很简单,创建这些接口是为了避免在您只有一个时传递n
次不必要的类型参数。
public interface UnaryOperator<T> extends Function<T, T>
所以写一个Function<T, T>
只是更长而且没有必要。
谈论其他接口,例如: IntConsumer
vs. Consumer<Integer>
或DoubleToIntFunction
vs. Function<Double, Integer>
其中第二个选项可能导致不必要的自动装箱并可能降低性能。
所以这就是为什么使用更具体、更合适的界面会让你的代码看起来更干净,让你远离意外。
是的,它们在功能上是相同的。 他们甚至扩展了您正在谈论的类并使用相同的SAM 。 UnaryOperator
和BinaryOperator
接口仅定义静态方法。
public interface UnaryOperator<T> extends Function<T, T>
public interface BinaryOperator<T> extends BiFunction<T,T,T>
它们只是为了简洁起见。 一次可以指定类型参数,为什么还要指定 2 或 3 次?
UnaryOperator
和BinaryOperator
是Function
和BiFunction
返回类型与输入类型BinaryOperator
同时的快捷方式。 我认为它们也可能具有不同的含义,根据您的上下文,操作和函数可能具有不同的解释,这主要是为了代码可读性,而不是出于技术原因。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.