我在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.
是否存在安全,不会抛出异常,获取数组尾部的方法?
答案 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
,但您可以使用headOption
和map
获得相同的效果:
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