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)
但它们是实例方法,我无法弄清楚是否可以使用方法指针运算符 .&将它们转换为双参数闭包.
你也可以这样做......
不确定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)
| 归档时间: |
|
| 查看次数: |
131 次 |
| 最近记录: |