【问题标题】:Scala apply list of functions to a objectScala 将函数列表应用于对象
【发布时间】:2017-02-04 21:28:27
【问题描述】:

我有很多功能

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)

如何通过将所有函数应用于data 变量来获得11?这样做的scala方式是什么?

【问题讨论】:

标签: scala


【解决方案1】:

您正在寻找的是foldLeft。实际上,对于每个函数,您都将其应用于先前的结果:

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

【讨论】:

    【解决方案2】:

    Function 辅助对象中使用chain 方法的另一种方法

    Function.chain(funcs)(data)
    

    【讨论】:

      【解决方案3】:

      你可以使用foldLeft:

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

      【讨论】:

        【解决方案4】:

        基本上,您正在尝试在此处实现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 了解更多信息。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2018-11-25
          • 2018-04-25
          • 1970-01-01
          • 2019-02-11
          相关资源
          最近更新 更多