Groovy中的链(组合)方法调用

Groovy中的链(组合)方法调用,groovy,clojure,Groovy,Clojure,我有一个变量和几个方法,我想按顺序调用,其中一个方法的返回值是另一个方法的输入。基本上是一条管道。现在,有没有办法把电话联系起来?在伪代码中,它看起来像 def a = [1, 2, 3] def b = calculation3(calculation2(calculation1(a))) 正如您所看到的,它看起来非常类似于Clojure,我希望以类似的方式结束(使用Clojure语法) 我希望将与关键字一起使用,但它只传递变量a,而不收集结果并将其作为输入传递给下一个方法 到目前为止,我找

我有一个变量和几个方法,我想按顺序调用,其中一个方法的返回值是另一个方法的输入。基本上是一条管道。现在,有没有办法把电话联系起来?在伪代码中,它看起来像

def a = [1, 2, 3]
def b = calculation3(calculation2(calculation1(a)))
正如您所看到的,它看起来非常类似于Clojure,我希望以类似的方式结束(使用Clojure语法)

我希望将
关键字一起使用,但它只传递变量
a
,而不收集结果并将其作为输入传递给下一个方法

到目前为止,我找到的唯一有效的解决方案是这样的“闭包组合”。但这对我来说似乎太严厉了

def a = [1, 2, 3]
def b = (class1.&calculation1 >> class1.&calculation2 >> class1.&calculation3)(a)

有什么想法吗?

您可以编写一个函数来执行此操作:

def chain(a, Closure... fns) {
    fns.toList().inject(a) { v, c -> c(v) }
}
然后在代码中调用此选项:

chain(a, class1.&calculation1,class1.&calculation2,class1.&calculation3)

您可以编写一个函数来执行此操作:

def chain(a, Closure... fns) {
    fns.toList().inject(a) { v, c -> c(v) }
}
然后在代码中调用此选项:

chain(a, class1.&calculation1,class1.&calculation2,class1.&calculation3)

我仔细考虑了一下,得出了如下结论:

def compose = {...c ->
   {result ->
      c.each {
         result = it(result)
      }
   result
   }
}

def a = [1, 2, 3]
def b = compose(class1.&calculation1, class1.&calculation2, class1.&calculation3)(a)

但还是不如Clojure的线程好

我仔细考虑了一下,得出了如下结论:

def compose = {...c ->
   {result ->
      c.each {
         result = it(result)
      }
   result
   }
}

def a = [1, 2, 3]
def b = compose(class1.&calculation1, class1.&calculation2, class1.&calculation3)(a)

但还是不如Clojure的线程好

使用
注入

def pipe(fn, ...fns) {
    { args ->
        fns.inject(fn(args)) { acc, value ->
            value(acc)
        }
    }
}

不允许第一个函数接受可变数量的参数,而不允许以下参数。

使用
inject

def pipe(fn, ...fns) {
    { args ->
        fns.inject(fn(args)) { acc, value ->
            value(acc)
        }
    }
}

不允许第一个函数接受可变数量的参数,而不允许以下参数。

改用Clojure?:)我很乐意,但我正在做的项目是Groovy/Grailst最后一个看起来和Clojure非常接近。至少跨多行时。我的问题是,它在内部会生成两个以上的闭包。请改用Clojure?:)我很乐意,但我正在做的项目是Groovy/Grailst最后一个看起来和Clojure非常接近。当至少跨越多行时。我的问题是,它在内部会生成另外两个closures.Neat。很遗憾Groovy需要所有的
Foo&func
this&func
噪音。如果foo()可以解析为直接方法调用(假设存在),那么
&foo
(或类似内容)应该能够解析为不带前缀.Neat的方法引用。很遗憾Groovy需要所有的
Foo&func
this&func
噪音。如果foo()可以解析为直接方法调用(假设它存在),那么
&foo
(或类似内容)应该能够解析为不带前缀的方法引用。