编写理解以处理多个选项的可能方法

时间:2017-11-01 10:26:18

标签: scala

我定义了一个返回Option的函数。

以下代码可以正常使用

 def func :Option[Result]= {
  (for {
    src <- ele2
    id <- ele
  } yield {
    src match {
      case "test2" => Option(id.value).map(_.take(3))
          .filterNot(_ == "de").map(id => Result(id))
      case _ => None
    }
  }).getOrElse(None)
}

如果我删除getOrElse(None),我会收到Iterable[Option[Result]]与预期类型Option[Result]不匹配的编译错误

我想摆脱getOrElse(None)。是否有可能编写代码的方法

2 个答案:

答案 0 :(得分:2)

怎么样:

val res: Option[Result] = for {
  src <- ele2
  if src == "test2"
  id <- ele
} yield Result(id.value)

答案 1 :(得分:0)

对于Scala中的理解,只是flatMapmap的语法糖。在某些情况下,最好使用flatMapmap重写您的理解。

def func: Option[Result] = {
  ele2.flatMap { src =>
    ele.flatMap { id =>
      src match {
        case "test2" => Option(id.value).map(_.take(3))
          .filterNot(_ == "de").map(id => Result(id))
        case _ => None
      }
    }
  }
}

另一种选择只是从yield提取逻辑到函数

def func: Option[Result] = {
  def innerLogic(src: String, id: Demo): Option[Result] = {
    src match {
      case "test2" => Option(id.value).map(_.take(3))
        .filterNot(_ == "de").map(id => Result(id))
      case _ => None
    }
  }

  for {
    src <- ele2
    id <- ele
    res <- innerLogic(src, id)
  } yield {
    res
  }
}