处理多个选项的最佳方法scala

时间:2016-08-30 18:49:37

标签: scala monads optional

我目前正在使用一些具有多种Option类型的scala代码,我需要在对象上设置它们(如果它们存在

目前我正在做以下

def myFunc(arg1: Option[Int], arg2: Option[Float]) {
    val objSet1 = arg1.fold(obj)(obj.setArg1)
    val objSet2 = arg2.fold(objSet1)(objSet1.setArg2)
    obj.runComputation()
}

我觉得有一种方法可以通过理解来更优雅地做到这一点,但是我的monad思考让我无法理解......

1 个答案:

答案 0 :(得分:1)

我认为实际上并没有内置任何内容,但你可以这样做:

implicit class MaybeModifyOps [T](underlying: T) {
  def maybeModify[X](a: Option[X])(f: (T,X) => T): T = a.fold(underlying)(f(underlying,_))
}

并像这样使用它:

obj
  .maybeModify(arg1)(_ setArg1 _)
  .maybeModify(arg2)(_ setArg2 _)
  .runComputation()