为什么在Scala中没有tailOption
,如果有headOption
?
这是一个old问题,在谷歌上找不到答案。
答案 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
可以完全满足您的需求