Java 8:java.util.function中的TriFunction(和亲属)在哪里?还是有什么选择?

Java 8:java.util.function中的TriFunction(和亲属)在哪里?还是有什么选择?,第1张

Java 8:java.util.function中的TriFunction(和亲属)在哪里?还是有什么选择?

据我所知,只有两种功能,破坏性的和建设性的。

顾名思义,建设性功能可以构造某些东西,而破坏性功能可以破坏某些东西,但是不会像您现在想的那样。

例如功能

Function<Integer,Integer> f = (x,y) -> x + y

建设性的 。如您需要构造的东西。在示例中,构造了元组 (x,y)
。构造函数具有无法处理无限参数的问题。但最糟糕的是,您不能只留下一个争论。您不能只说“好吧,让x:= 1”并尝试每个可能尝试的y。您必须每次使用构造整个元组

x := 1
。因此,如果您想查看函数返回的内容,
y := 1, y := 2, y := 3
则必须编写
f(1,1) , f(1,2) ,f(1,3)


在Java
8中,应该使用方法引用来处理构造函数(大部分时间),因为使用构造性lambda函数没有太多优势。它们有点像静态方法。您可以使用它们,但是它们没有真实状态。

另一种是破坏性的,需要采取一些措施并根据需要将其拆除。例如, 破坏性 功能

Function<Integer, Function<Integer, Integer>> g = x -> (y -> x + y)

与具有

f
建设性的功能相同。破坏性函数的好处是,您现在可以处理无限个参数,这对于流来说特别方便,并且您可以仅打开参数。因此,如果您再次想查看if
x:= 1
和if的结果
y := 1 , y := 2 , y := 3
,您可以说
h = g(1)
and
h(1)
是for
y :=1
h(2)
for
y := 2
h(3)
for 的结果
y := 3

所以这里您有一个固定的状态!这是非常动态的,并且在大多数情况下是我们从lambda中想要的。

如果您只需放入一个可以为您完成工作的函数,那么像Factory这样的模式就容易得多。

破坏性元素很容易彼此结合。如果类型正确,则可以根据需要进行组合。使用它,您可以轻松定义使(具有不变的值)测试变得容易得多的态射!

您也可以用一个建设性的结构来做到这一点,但是破坏性的结构看起来更好,更像是列表或装饰器,而建设性的结构看起来很像一棵树。带有构造函数的回溯之类的事情就不好了。您可以只保存破坏性函数的部分功能(动态编程),而在“回溯”中仅使用旧的破坏性功能。这使代码更小,更易读。使用构造函数,您或多或少会记住所有参数,这可能很多。

那么,为什么需要

BiFunction
更多的问题而不是为什么没有问题
TriFunction
呢?

首先,很多时候您只有几个值(小于3)并且只需要一个结果,因此根本不需要常规的破坏函数,而建设性函数就可以了。诸如monad之类的东西确实需要构造功能。但是除此之外,实际上并没有很多充分的理由说明为什么会有一个

BiFunction
。这并不意味着应该将其删除!我为我的Monad战斗,直到我死!

因此,如果您有很多参数,不能将它们组合到一个逻辑容器类中,并且您需要函数具有构造性,请使用方法引用。否则,尝试使用新获得的破坏性功能,您可能会发现自己用更少的代码行来做很多事情。



欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/zaji/5426808.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-11
下一篇 2022-12-11

发表评论

登录后才能评论

评论列表(0条)

保存