据我所知,只有两种功能,破坏性的和建设性的。
顾名思义,建设性功能可以构造某些东西,而破坏性功能可以破坏某些东西,但是不会像您现在想的那样。
例如功能
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战斗,直到我死!
因此,如果您有很多参数,不能将它们组合到一个逻辑容器类中,并且您需要函数具有构造性,请使用方法引用。否则,尝试使用新获得的破坏性功能,您可能会发现自己用更少的代码行来做很多事情。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)