我有一些功能
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方式呢?
答案 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
。因此,您可以在此处使用compose
和andThen
方法:
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)
您的示例中result1
和result2
都 11 。
请注意,andThen
和compose
的运作方式不同。您可以查看Functional Composition以获取更多信息。