在 Scala 中使用 "for" 和 "match" 的选项处理之间的区别
Difference between Option handling using "for" and "match" in Scala
我目前正在学习 Scala,遇到了两种不同的处理选项的方法。结果是一样的,但我想知道使用其中一个是否比另一个有优势(或者是否有更好的东西)。
函数divByTwo1和divByTwo2将return输入除以2,如果输入也可以除以4,否则将returnNone.
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
}
}
最干净的版本大概是这个:
def divByTwo(i: Int): Option[Int] = divByFour(i).map(_ * 2)
作为一般规则,当结果是 Option
时,我会使用 map
/flatMap
/filter
,因为它将计算保持在 Option
容器。当您从 Option
容器中提取数据并且结果是其他类型时,请使用 match
/fold
/getOrElse
。
使用 for
作为处理多个 map
/flatMap
/filter
调用的便捷方式,但我个人避免使用单个 map
调用.
我目前正在学习 Scala,遇到了两种不同的处理选项的方法。结果是一样的,但我想知道使用其中一个是否比另一个有优势(或者是否有更好的东西)。
函数divByTwo1和divByTwo2将return输入除以2,如果输入也可以除以4,否则将returnNone.
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
}
}
最干净的版本大概是这个:
def divByTwo(i: Int): Option[Int] = divByFour(i).map(_ * 2)
作为一般规则,当结果是 Option
时,我会使用 map
/flatMap
/filter
,因为它将计算保持在 Option
容器。当您从 Option
容器中提取数据并且结果是其他类型时,请使用 match
/fold
/getOrElse
。
使用 for
作为处理多个 map
/flatMap
/filter
调用的便捷方式,但我个人避免使用单个 map
调用.