我多次看到奇怪的代码:
...
private currencyFormat = NumberFormat.currencyInstance
def convert = currencyFormat.&parse
...
奇怪我的意思是这个 -> .&parse。为什么需要逻辑 AND 运算符,还有谁可以使用它?
我多次看到奇怪的代码:
...
private currencyFormat = NumberFormat.currencyInstance
def convert = currencyFormat.&parse
...
奇怪我的意思是这个 -> .&parse。为什么需要逻辑 AND 运算符,还有谁可以使用它?
这是一个方法指针
convert
现在实际上是一个委托给 parse 方法的闭包
它在这里定义,没有示例,mrhaki 在这里做了一篇关于它的帖子。
作为一个显示它处理重载的示例,考虑一个具有 2 个静态方法的类:
class Test {
static void printSomething( String thing ) {
println "A:$thing"
}
static void printSomething( String thing, String thing2 ) {
println "B:$thing$thing2"
}
}
我们可以参考这些printSomething
方法:
def ref = Test.&printSomething
然后我们可以将它传递each
给对单个项目列表的调用:
// prints A:a and A:b
[ 'a', 'b' ].each ref
或者我们可以传递两个项目,它会选择正确的重载方法来调用:
// prints B:ab and B:cd
[ [ 'a', 'b' ], [ 'c', 'd' ] ].each ref
这不是一个位操作运算符。可能选择与号是因为这是 C 的地址运算符使用的。这个想法是您可以传递对特定实例上的方法的引用。
假设您有一些逻辑,例如:
def stuff = null
if (condition) {
stuff = foo.doThis(a, b, c)
} else {
stuff = bar.doOther(a, b, c)
}
你可以用这样的方法指针重写它:
def myMethod = condition ? foo.&doThis : bar.&doOther
def stuff = myMethod(a, b, c)
这并不意味着and
。将方法重用为闭包是一种特殊的语法。现在您可以convert
在可以传递闭包的地方使用,例如grep
或find
类似方法。