我想获得Seq
的第n个元素,如下所示:
val mySeq = Seq("A", "B", "C")
mySeq.get(1) // Java syntax for List. This does not work.
答案 0 :(得分:18)
为避免索引越界,
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
解除序列,
mySeq.lift(2)
Some(C)
mySeq.lift(200)
None
或以类似的方式,
mySeq.drop(2).headOption
Some(C)
mySeq.drop(200).headOption
None
通过提升序列,我们将Int
的部分函数定义到序列的每个值上。即从每个位置索引到其对应的值。因此,未定义的位置(任何负值或大于集合的大小)都会映射到None
,其余的已定义并变为Some
值。
答案 1 :(得分:16)
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
答案 2 :(得分:2)
获取Seq
的 n 元素的方法是apply
:
val mySeq = Seq("A", "B", "C")
mySeq.apply(1) // "B"
通常你永远不会写x.apply(y)
而只是使用简写x(y)
。 Scala编译器会为你转换它。
mySeq(1) // "B"
答案 3 :(得分:0)
在Tom的回答中,还有一个特定的用例,其中需要.apply(),如果您有一个只投给seq的对象。在这种情况下,您不能使用(),因为您的对象未命名。这是一个示例:
println("Count of column test in MyDF is "+MyDF.groupBy().agg(count("test")).first.toSeq.apply(0));
或者,坚持上面的例子:
println("Second element of Seq(\"A\", \"B\", \"C\") is: "+Seq("A", "B", "C").apply(1));
Second element of Seq("A", "B", "C") is: B