2017-02-04 21 views
1

我有一個點亮的功能斯卡拉適用的功能列表的對象

val f1 = (x: Int) => x + 1 
val f2 = (x: Int) => x + 2 
val f3 = (x: Int) => x + 3 

我有一個值:

val data = 5 

我想所有的功能應用到價值和回報單值。所以

f3(f2(f1(data))) 

而且必須返回11

現在,如果我有功能的序列:

val funcs = Seq(f1, f2, f3) 

我怎樣才能從11應用的所有功能於data變量?什麼是scala方式來做到這一點?

+0

基本上是這樣的一個副本:http://stackoverflow.com/questions/15338029/elegant-way-to-chain-data-transformations-in-scala它本身被封閉爲重複的http://stackoverflow.com/questions-11349480/apply-several-string-transformations-in-scala如果在措辭上不是很接近,那麼它確實是等效的 –

+0

[在scala中應用多個字符串轉換]的可能重複(http://stackoverflow.com/questions/11349480 /應用-數字符串,轉換功能於階) –

回答

4

你在找什麼是foldLeft。事實上,對於每一個功能,您將它應用到前面的結果:

funcs.foldLeft(data){ (previousres, f) => f(previousres) } 
1

您可以使用foldLeft

val result = funcs.foldLeft(5)((acc,curr) => curr(acc)) 
5

另一種方法來使用chain方法在Function輔助對象做

Function.chain(funcs)(data) 
1

基本上,您正試圖在此處實現Function Composition。所以,你可以在這裏使用composeandThen方法爲:

val data = 5 

    val funcs = Seq(f1, f2, f3) 

    //using compose 
    val result1 = funcs.reduce((a,b) => a.compose(b))(data) 

    //using andThen 
    val result2 = funcs.reduce((a,b) => a.andThen(b))(data) 

兩個result1result2將成爲你的榜樣。

請注意,andThencompose的操作方式不同。你可以看到Functional Composition瞭解更多信息。