有没有办法将运算符称为双参数闭包?

Tob*_*bia 1 groovy closures operators

有时我需要将一个运算符作为闭包传递,如下所示:

do.some.thing() { x,y -> x+y }
Run Code Online (Sandbox Code Playgroud)

我想知道是否有任何简写的"操作符指针"语法,类似于"方法指针"语法,这将使操作符已经包含在一个双参数闭包中.

我看到大多数算术运算符都可用作Number和相关类的方法:

public Number plus(Number right)

Add two numbers and return the result.
Run Code Online (Sandbox Code Playgroud)

但它们是实例方法,我无法弄清楚是否可以使用方法指针运算符 .&将它们转换为双参数闭包.

tim*_*tes 5

你也可以这样做......

不确定uncurry是正确的术语,但它几乎是正确的;-)

import org.codehaus.groovy.runtime.MethodClosure

def uncurry(MethodClosure c) {
    {a, ...b -> a."$c.method"(*b) }
}
Run Code Online (Sandbox Code Playgroud)

然后,要进行2个arg闭包Number.plus,你可以这样做:

def plus = uncurry(Number.&plus)
Run Code Online (Sandbox Code Playgroud)

然后:

assert plus(1, 2) == 3
Run Code Online (Sandbox Code Playgroud)

这也适用于其他方法句柄:

def collate = uncurry(List.&collate)
assert collate([1, 2, 3, 4, 5], 2, true) == [[1, 2], [3, 4], [5]]
Run Code Online (Sandbox Code Playgroud)