可能构成函数的惯用法

时间:2013-09-13 14:44:26

标签: scala

我通过一系列链接函数调用构建一个值(所有结果都是B类型):

val o: Option[String] = ...
val b: B = someFunc()
    .map(func1)
    .map(func2)
    .map(/* want to apply func3 here if o.isDefined)

现在,我只有在func3: (B, String) => B定义的情况下才会应用o,在这种情况下,我还希望将选项的值作为第二个参数传递给它。这相当于:

val tmp: B = someFunc()
    .map(func1)
    .map(func2)
val b = o.fold{b}{v => func3(tmp, v)}

但我不想打破调用链。任何惯用的方法吗?

1 个答案:

答案 0 :(得分:1)

明显简单但不优雅的解决方案如下:

val b = someFunc().map(func1).map(func2)
  .map( a => if( o.isDefined ) func3( a, v ) else a )

以下是您建议的修改版本:

val b = someFunc().map(func1).map(func2)
  .map( a => o.foldLeft( a )( func3 ) )