Scala将函数列表应用于对象

时间:2017-02-04 10:38:39

标签: scala

我有一些功能

args={'color':'blue','size':'XX'}
query="INSERT INTO items (name, attributes) VALUES ('Shirt',     COLUMN_CREATE(%s))"
db.execute(query,(args))
conn.commit()

我有一个值:

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

我想将所有函数应用于值并返回单个值。所以

val data = 5

必须返回11。

现在,如果我有一系列功能:

f3(f2(f1(data)))

如何让val funcs = Seq(f1, f2, f3) 将所有功能应用到11变量?什么是scala方式呢?

4 个答案:

答案 0 :(得分:9)

使用chain辅助对象中的Function方法执行此操作的另一种方法

Function.chain(funcs)(data)

答案 1 :(得分:5)

您要找的是foldLeft。实际上,对于每个函数,您都将它应用于之前的结果:

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

答案 2 :(得分:1)

您可以使用foldLeft

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

答案 3 :(得分: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 11

请注意,andThencompose的运作方式不同。您可以查看Functional Composition以获取更多信息。