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

时间:2016-05-04 22:16:27

标签: groovy closures operators

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

do.some.thing() { x,y -> x+y }

我想知道是否有任何速记"操作指针"类似于"method pointer" syntax的语法,它会让运算符已经包含在一个双参数闭包中。

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

public Number plus(Number right)

Add two numbers and return the result.

但它们是实例方法,我无法弄清楚是否可以使用method pointer operator .&将它们转换为双参数闭包。

2 个答案:

答案 0 :(得分:5)

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

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

import org.codehaus.groovy.runtime.MethodClosure

def uncurry(MethodClosure c) {
    {a, ...b -> a."$c.method"(*b) }
}

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

def plus = uncurry(Number.&plus)

然后:

assert plus(1, 2) == 3

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

def collate = uncurry(List.&collate)
assert collate([1, 2, 3, 4, 5], 2, true) == [[1, 2], [3, 4], [5]]

答案 1 :(得分:3)

不,没有这样的操作员。

方法指针操作符不起作用,因为它创建的MethodClosure基本上有一个对象,在本例中是Number类,以及方法 name 。所以,如果你这样做......

def c = Number.&plus

然后拨打c会尝试拨打plus() 课程上的Number,这当然无法正常工作。

我能想到的唯一捷径就是声明操作员关闭一次,然后根据需要重复使用它们。

相关问题