为什么Scala中没有tailOption?

时间:2017-03-17 13:03:28

标签: scala

为什么在Scala中没有tailOption,如果有headOption

这是一个old问题,在谷歌上找不到答案。

3 个答案:

答案 0 :(得分:7)

不需要tailOption。如果您希望函数的行为类似于tail。但是当在空集合上使用时返回空集合,您可以使用drop(1)。当我想在创建对列表时优雅地处理空集合时,我经常使用它:

s zip s.drop(1)

如果你想要空集合None而非空集合Some(tail),你可以使用:

s.headOption.map(_ => s.tail)

或(如果您不介意抛出和捕获异常,这可能会慢一点):

Try {s.tail}.toOption

我很难想象其他选项的合理用例。

答案 1 :(得分:1)

我之前从未想到这一点,有趣的是为什么tailOption不属于标准库。我不知道它为什么不存在,但我们可以通过捕获空列表尾部抛出的错误来扩展功能。

def getOption[A](a: => A) = {
   try{ Some(a) }
   catch { case e: Exception => None }
}

getOption(List(1,2,3).tail) // Some(3)
getOption(Nil.tail)  // None

答案 2 :(得分:0)

实际上,有lastOption可以完全满足您的需求