2015-06-19 80 views
1

我有一个变量和几个方法,我想调用一个方法的返回值是另一个方法的输入。基本上是一个管道。现在有没有连接电话的方法?在伪代码,它看起来像Groovy中的链(组合)方法调用

def a = [1, 2, 3] 
def b = calculation3(calculation2(calculation1(a))) 

正如你可以看到它看起来非常的Clojure样,我想结束了类似的信息(使用Clojure的语法)

(-> a 
    calculation1 
    calculation2 
    calculation3) 

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

到目前为止我发现的唯一工作解决方案就是这样的'闭合组合'。但是这似乎对我来说过于沉重。

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

任何想法?

+0

改用Clojure? :) –

+0

我很想去,但我正在研究的项目是Groovy/Grails – defectus

+0

最后一个看起来非常接近Clojure's。至少跨越多行时。 –

回答

2

你可以写一个函数来做到这一点:

def chain(a, Closure... fns) { 
    fns.toList().inject(a) { v, c -> c(v) } 
} 

然后调用这个在你的代码:

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

我给多一点思考,并拿出了这样的事情:

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的线程好。

+0

整洁。很遗憾Groovy需要所有'Foo。&func'或'this。&func'噪音。如果foo()可以解析为直接方法调用(假设它存在),那么'&foo'(或类似的东西)应该能够解析为没有前缀的方法引用。 – Paul