我定义了一个返回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)
。是否有可能编写代码的方法
答案 0 :(得分:2)
怎么样:
val res: Option[Result] = for {
src <- ele2
if src == "test2"
id <- ele
} yield Result(id.value)
答案 1 :(得分:0)
对于Scala中的理解,只是flatMap
和map
的语法糖。在某些情况下,最好使用flatMap
和map
重写您的理解。
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
}
}