0

我正在通过一系列链接函数调用来构建一个值(所有结果都是 type 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)}

但我不想打破调用链。有什么惯用的方法吗?

4

1 回答 1

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 ) )
于 2013-09-13T15:15:24.003 回答