安全地获得阵列的尾巴

时间:2013-09-06 00:08:33

标签: scala

我在tail上拨打Array,但看到了警告。

scala> val arr = Array(1,2)
arr: Array[Int] = Array(1, 2)

scala> arr tail
warning: there were 1 feature warning(s); re-run with -feature for details
res3: Array[Int] = Array(2)

Array的Scaladocs显示UnsupportedOperationException [will be thrown] if the mutable indexed sequence is empty.

是否存在安全,不会抛出异常,获取数组尾部的方法?

3 个答案:

答案 0 :(得分:13)

  

是否有安全,不会抛出异常,获得尾部的方式   阵列

您可以使用drop

scala> Array(1, 2, 3).drop(1)
res0: Array[Int] = Array(2, 3)

scala> Array[Int]().drop(1)
res1: Array[Int] = Array()

另请注意,正如@TravisBrown在下面的评论中所提到的,drop不区分空尾(对于具有一个元素的集合)和缺少尾(对于空集合)在这两种情况下,drop(1)都会返回一个空集合。

答案 1 :(得分:7)

首先,警告与您使用不安全方法的事实无关。如果您使用-feature重新启动REPL,则会看到以下内容:

scala> arr tail
<console>:9: warning: postfix operator tail should be enabled
by making the implicit value language.postfixOps visible...

指向scala.language.postfixOps的{​​{3}}指针,其中包含以下注释:

  

后缀运算符与分号推断的交互性很差。大多数程序员都是出于这个原因而避开它们。

这是一个很好的建议。能够写arr tail代替arr.tail并不值得大惊小怪。

现在关于安全问题。标准库不为集合提供tailOption,但您可以使用headOptionmap获得相同的效果:

scala> val arr = Array(1, 2)
arr: Array[Int] = Array(1, 2)

scala> arr.headOption.map(_ => arr.tail)
res0: Option[Array[Int]] = Some([I@359be9fb)

如果这对您来说过于冗长或不透明或效率低下,您可以轻松创建一个隐式类,可以将tailOption更好地添加到Array(或Seq或{{1等等。)。

答案 2 :(得分:0)

请参阅@ TravisBrown的答案,了解您的警告。

我个人会在阵列的头上使用scala.util.Try而不是他相当聪明的地图:

scala> val arr = Array(0, 1, 2)
arr: Array[Int] = Array(0, 1, 2)

scala> scala.util.Try {arr.tail} foreach {t => println(t.mkString(","))}
1,2