我目前正在学习Scala,遇到了两种处理选项的方法。结果是相同的,但我想知道使用一个相对于另一个是否有优势(或者是否有更好的选择)。
如果输入也可以除以4,则divByTwo1和divByTwo2函数将返回输入除以2,否则返回None。
def divByFour(i: Int): Option[Int] = {
if (i % 4 == 0) {
Some(i / 4)
} else {
None
}
}
def divByTwo1(i: Int): Option[Int] = {
for {
fourth <- divByFour(i)
} yield fourth * 2
}
def divByTwo2(i: Int): Option[Int] = {
divByFour(i) match {
case Some(fourth) => Some(fourth * 2)
case None => None
}
}
答案 0 :(得分:6)
最干净的版本可能是这样:
def divByTwo(i: Int): Option[Int] = divByFour(i).map(_ * 2)
通常,我将在结果为map
时使用flatMap
/ filter
/ Option
,因为它将计算保留在Option
内容器。从match
容器中提取数据时使用fold
/ getOrElse
/ Option
,结果是其他类型。
使用for
作为处理多个map
/ flatMap
/ filter
呼叫的便捷方法,但我个人避免在单个map
呼叫中使用它。 / p>