根据列表空白返回不同值的最佳方法

时间:2014-01-31 10:05:20

标签: scala scala-collections

给定一个列表,根据该列表的空白值返回值的最佳方法是什么?

使用匹配?

xs match {
    case Nil => a
    case _ => b
}

或if语句?

if (xs.isEmpty) a else b

在这种情况下,模式匹配似乎触发了很多样板。对于这种情况,有没有惯用的解决方案?

3 个答案:

答案 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'