给定一个列表,根据该列表的空白值返回值的最佳方法是什么?
使用匹配?
xs match {
case Nil => a
case _ => b
}
或if语句?
if (xs.isEmpty) a else b
在这种情况下,模式匹配似乎触发了很多样板。对于这种情况,有没有惯用的解决方案?
答案 0 :(得分:4)
“偏好”是主观的,但简单if
有一些优势:
在这种情况下似乎没有必要使用模式匹配,因为你并没有真正利用它的功能(例如没有提取)。
第二种方法明确告诉您检查列表是否为空,因此可以立即读取。
总结:Scala中的模式匹配是一个功能强大的工具,由于它的强大功能,它在机器和人类可读性方面增加了代码的复杂性。换句话说:并非一切都是钉子;)。
答案 1 :(得分:1)
当您需要递归或head :: tail
时,首选模式匹配语法。 Scala中的List
受到较旧的ML语言(Cons(head, tail)
)的启发,您可以得到一个很好的head :: tail
对来匹配:
someList match {
case head :: tail => // this will actually be someList.head and someList.tail
case Nil => // ..
}
答案 2 :(得分:0)
我不会说它更好,但另一种选择是:
xs.headOption.fold(a)(_ => b)
在这种情况下,它看起来有点奇怪,因为你忽略了head元素并返回b
,但是如果你真的想用它作为返回值,那么下面是非常优雅的:
xs.headOption.getOrElse(a) //will return the head element or a if none
我最喜欢的是添加一些scalaz
:
import scalaz._
import Scalaz._
xs.headOption ? b | a // if defined 'b' else 'a'