我经常遇到以下问题:
val b = a match {
case Some(a) => "1"
case None => "n"
}
val c = a match {
case Some(a) => "2"
case None => "n"
}
显然,即使只需要一次,匹配也会执行两次。我怎样才能确保编译器考虑到这一点?
答案 0 :(得分:8)
我认为不会有任何性能提升,但您可以像这样编写代码:
val (b, c) = a match {
case Some(a) => ("1","2)
case None => ("n", "n")
}
答案 1 :(得分:1)
匹配可以非常快 - 与if语句相当。除非这是一场艰难的比赛,否则不要担心做两次工作。
匹配默认值比其他情况稍微容易一些,所以如果你真的不需要参数,最好的选择是
val b = a match { case None => "n"; case _ => "1" }
val c = a match { case None => "n"; case _ => "2" }
这甚至会超越像
这样的可变解决方案var b,c = "n"
a match { case Some(_) => b = "1"; c = "2"; case _ => }
并且肯定会胜过任何元组创建。
如果匹配是一个耗时的,那么你必须存储结果并将它们返回到元组或其他合适的数据结构中,如om-nom-nom已经证明的那样。根据具体情况,这也可能更为明确。