繁体   English   中英

当我在 Java 8 中有函数时使用 Unaryoperator 和 Binaryoperator

[英]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>的性质,将minBymaxBy类的东西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 UnaryOperatorBinaryOperator接口仅定义静态方法。

public interface UnaryOperator<T> extends Function<T, T>

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

它们只是为了简洁起见。 一次可以指定类型参数,为什么还要指定 2 或 3 次?

UnaryOperatorBinaryOperatorFunctionBiFunction返回类型与输入类型BinaryOperator同时的快捷方式。 我认为它们也可能具有不同的含义,根据您的上下文,操作和函数可能具有不同的解释,这主要是为了代码可读性,而不是出于技术原因。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM