2015-06-19 98 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