例如,我们定义了一个函数,该函数应将1、3、42分别转换为"foo"、"bar"、"qix"和所有其他整数。
我提出了两个实现:方法f
需要是独立的,因为它可以在其他上下文中重用。
def f(i: Int): Option[String] = i match {
case 1 => Some("foo")
case 3 => Some("bar")
case 42 => Some("qix")
case _ => None
}
def g(i: Int) : String = f(i).getOrElse("X")
和:
def f_ : PartialFunction[Int, String] = {
case 1 => "foo"
case 3 => "bar"
case 42 => "qix"
}
def g_(i: Int) : String = f_.orElse { case _ => "X" }(i)
我倾向于选择第二种,因为它避免了许多重复的某些(…)
WDYT?
我不知道你为什么要使用选项,因为你可以很容易地做到这一点,并获得完全相同的结果:
def f(i: Int): String = i match {
case 1 => "foo"
case 3 => "bar"
case 42 => "qix"
case _ => "X"
}
它甚至为您节省了一个讨厌的getOrElse
你甚至可以做得更好,既不用PartialFunction
也不用match
,只需要这样做:
def f: Int => String = {
case 1 => "foo"
case 3 => "bar"
case 42 => "qix"
case _ => "X"
}
这节省了您编写一次性i
的时间
fScala的Map已经是一个分部函数。因此,您可以使用它,而不是定义自己的函数,该函数正是Map所做的——"从类型A的键映射到类型B的值"
所以你所要做的就是:
val f = Map(1 -> "foo", 3 -> "bar", 42 -> "qix")
def g(i: Int) = f.getOrElse(i, "X")
f(1) //foo
f(4) // throw NoSuchElementException: Key not found: 4
f.get(1) // Some(foo)
f.get(4) // None
g(1) //foo
g(4) //X
现在,您可以使用函数"g"或根据其他需要重用"f"。
根据您的评论编辑了我的示例:
def f(i: Int): Option[String] = {
val map = Map(1 -> "foo", 3 -> "bar", 42 -> "qix")
i match {
case x if (map.contains(x)) => Some(map(x))
case _ => None
}
}
def g(i: Int) : String = f(i).getOrElse("X")
我认为函数应该以某种有意义的方式对给定范围之外的整数做出反应。这就是为什么我更喜欢Option
。
选项是处理null值的好方法部分函数只是部分匹配,它们并不相同,即使Option和PartialFunction都有类似的或Else方法
由于分部函数是函数,所以它可以被链接,但选项不能,选项是处理null值的方法。
对于你可以这样做的部分函数,它更像是责任链
def f_1 : PartialFunction[Int, String] = {
case 1 => "1"
}
def f_2 : PartialFunction[Int, String] = {
case 2 => "2"
}
def f_3 : PartialFunction[Int, String] = {
case 3 => "3"
}
f_1.orElse(f_2).orElse(f_3)(3)
您可能想尝试一下。这里HashMap可以让你快速查找:
object SomeMain {
import scala.collection.immutable.HashMap
def f(i: Int): Option[String] = {
HashMap(1 -> "foo", 3 -> "bar", 42 -> "qix").get(i).orElse(None)
}
def g(i: Int): String = f(i).getOrElse("X")
def main(args: Array[String]) {
List(1, 3, 42, 10) foreach { x => println(x + ": " + g(x)) }
}
}
输出:
1: foo
3: bar
42: qix
10: X