将运算符作为函数传递

时间:2015-10-20 15:40:32

标签: groovy syntax

我是Groovy的新手。我想将一个运算符作为函数传递。

而不是:

nums.inject(0) { acc, el -> acc * el }

我想做点什么:

nums.inject(0) {*}

在F#中,这是可能的。 Groovy是否提供相同的语法糖?

let product = List.reduce (*) nums 0

2 个答案:

答案 0 :(得分:2)

不允许传递操作符,但函数/闭包是,或多或少等效

def product = nums.inject(1, Math.&multiplyExact)

inject有两个参数,一个对象和一个闭包。您的示例定义了自己的闭包,但可以使用method pointer operator (.&)

将方法引用为闭包

在括号外放置一个文字闭包,{ }是一个小小的语法糖,可以对任何闭包作为方法调用的最后一个参数。< / p>

答案 1 :(得分:1)

我不这么认为。但是,你可以通过一些元编程接近。

reduce(Object, Closure)

为了让您更好地了解nums.reduce(1) { num -> multiply(num) } 方法的工作原理,还有其他方法可以使用它:

multiply(Number)

闭包的唯一参数是当前元素。因为所有方法调用和属性访问都被委托给累加器,所以acc.multiply(num)方法对累加器执行:Domain1 d1 = new Domain1("id1", "name1", "attribute1"); Domain2 d2 = new Domain2("id1", "name1", "attribute1"); Domain3 d3 = new Domain3("id1", "name3", "attribute3");