如何获得Seq的第n个元素?

Tom*_*ang 20 scala

我想获得a的第n个元素Seq,如下所示:

val mySeq = Seq("A", "B", "C")
mySeq.get(1) // Java syntax for List. This does not work.
Run Code Online (Sandbox Code Playgroud)

elm*_*elm 21

为了避免索引超出范围,

scala> mySeq(200)
java.lang.IndexOutOfBoundsException: 200
  at scala.collection.LinearSeqOptimized$class.apply(LinearSeqOptimized.scala:65)
  at scala.collection.immutable.List.apply(List.scala:84)
  ... 33 elided
Run Code Online (Sandbox Code Playgroud)

解除序列,

mySeq.lift(2)
Some(C)

mySeq.lift(200)
None
Run Code Online (Sandbox Code Playgroud)

或以类似的方式,

mySeq.drop(2).headOption
Some(C)

mySeq.drop(200).headOption
None
Run Code Online (Sandbox Code Playgroud)

通过提升序列,我们从Int序列的每个值定义部分函数.即从每个位置索引到其对应的值.因此,未定义的位置(任何负值或大于集合的大小)被映射到None,其余的被定义并变为Some值.


Bri*_*ian 17

mySeq.apply(1) 是另一种说法 mySeq(1)

scala> val mySeq = Seq("A", "B", "C")
mySeq: Seq[String] = List(A, B, C)

scala> mySeq(0)
res0: String = A

scala> mySeq(1)
res1: String = B
Run Code Online (Sandbox Code Playgroud)

  • 请注意,简写`apply`语法与通常用于访问Scala中数组的*nth*元素的语法相同.这使我们在序列和数组之间具有良好的对称性.例如,`val mySum = mySeq(0)+ myArray(0)` (2认同)

Tom*_*ang 6

获取a的第n个元素的方法Seqapply

val mySeq = Seq("A", "B", "C")
mySeq.apply(1) // "B"
Run Code Online (Sandbox Code Playgroud)

通常,你永远不会写x.apply(y),而只是使用速记x(y)。Scala 编译器将为您转换它。

mySeq(1) // "B"
Run Code Online (Sandbox Code Playgroud)

为了避免潜在的索引越界,您可以使用Try.

Try(mySeq(x)).toOption
Run Code Online (Sandbox Code Playgroud)

Nonex>= 3 和< 3Some(...)时返回x