Scala 切片函数
今天我们将研究 Scala 切片函数。
Scala 切片
Scala 切片函数在以下 API 类中可用:
我们将在下一节中挑选每个 API 并通过合适的示例深入讨论它们。
Scala 切片函数用法
在 Scala API 中,“slice”函数用于选择元素间隔。它接受两个“Int”类型的参数,并返回原始 Collection(或 String 或 Array)的子集、全部或无元素。真实世界的切片场景:-我们也可以在我们的日常生活中使用这个切片函数,如下所示。这里 Bread.slice(0,10) 表示从 0 到 9 取面包片,所以总共 10 片面包片。(为了类似于 Scala 的切片函数,我在这里使用零,但假设这是一个。)切片函数语法:在 Scala 标准库(API)中,此切片函数定义如下:
def slice(from-index: Int, until-index: Int): ScalaAPIClass[A]
这里的“ScalaAPIClass”是指任何 Scala Collection 类(支持基于索引的访问,如 Seq、List 等)、String、Array 类。示例:-以下函数在 Scala API 的 Seq 类中定义。
def slice(from-index: Int, until-index: Int): Seq[A]
slice 函数参数: slice 函数参数的用法说明如下表:
序号 | 函数参数 | 用法 |
---|---|---|
1. | 第一个参数 | 起始索引(含)。它应该是零或任何小于集合或字符串或数组长度的正整数。 |
2. | 第二个参数 | 结束索引(独家)。 |
切片函数从 'first-index' (包含) 到 'until-index' (不包含) 提取元素。这里的元素是数字数组的数字、字符串的字符、集合的对象。
Scala 数组切片
在Scala API中,Array类定义slice函数如下:
def slice(from: Int, until: Int): Array[T]
这里 'from' 是数组的起始索引(包含),'until' 是数组的结束索引(不包含)。数组切片函数示例:
scala> val marksArray = Array(56,79,60,99,71)
marksArray: Array[Int] = Array(56, 79, 60, 99, 71)
创建了具有 5 个值的数组的 int,因此它的索引起始值为 0,索引结束值为 4。它的长度 = 5 现在让我们使用切片函数。
scala> marksArray.slice(0,2)
res0: Array[Int] = Array(56, 79)
它从 0 索引(即第一个元素)开始,并检索所有元素,直到 2 表示索引 = 1,这就是为什么我们在这里得到第 0 个元素和第 1 个元素。
scala> marksArray.slice(3,4)
res1: Array[Int] = Array(99)
我们可以使用任意索引范围进行访问。
scala> marksArray.slice(3,3)
res2: Array[Int] = Array()
如果我们像上面一样为开始和结束赋予相同的值,我们将得到空数组,为什么?开始索引 = 3 结束索引 = 3 - 1 = 2 不可能从 3 到 2 个索引的数组中检索一组元素。
scala> marksArray.slice(-1,3)
res3: Array[Int] = Array(56, 79, 60)
如果我们给出 -ve 值,它就从可用索引开始,如上所示。
scala> marksArray.slice(0,5)
res4: Array[Int] = Array(56, 79, 60, 99, 71)
如果我们给出的第二个参数值超出了其可用索引,如上所示(marksArray 中可用的最大索引值仅为 4,因为其长度 = 5),它会忽略该值并仅返回可用索引。注意:- 与 Java 不同,它不会抛出任何 ArrayIndexOutOfBoundsException。
Scala 集合切片
在 Scala 的标准 API 中,大多数类都定义了此切片函数,该函数支持基于索引的元素访问。例如,List 类定义此函数如下所示:
def slice(from: Int, until: Int): List[A]
列出切片函数示例:-与数组示例相同,对于任何 Collection API,我们将获得相同的结果。
scala> val list = List(56, 79, 60, 99, 71)
list: List[Int] = List(56, 79, 60, 99, 71)
scala> list.slice(0,2)
res5: List[Int] = List(56, 79)
scala> list.slice(3,4)
res6: List[Int] = List(99)
scala> list.slice(3,3)
res7: List[Int] = List()
scala> list.slice(-1,3)
res8: List[Int] = List(56, 79, 60)
scala> list.slice(0,5)
res9: List[Int] = List(56, 79, 60, 99, 71)
如果我们访问一个空列表,我们将只得到空列表,如下所示
scala> val list2 = List()
list2: List[Nothing] = List()
scala> list2.slice(0,1)
res10: List[Nothing] = List()
Scala 字符串切片
在Scala API中,“StringOps”类定义在scala.collection.immutable包中。它定义了slice函数,如下所示:
def slice(from: Int, until: Int): String
注意:在 Scala 中,我们使用 Java 的 String 类。但此类没有切片函数。当我们在 Java 的 String 对象上使用切片函数时,Scala 编译器会内部将此 String 对象转换为 StringOps 类对象以使用此切片函数。(不仅有切片函数,还有更多。有关更多信息,请参阅 Scala API。)这意味着“StringOps”是 String 类的隐式类。 字符串切片函数示例:
scala> val str = "Hello I'm doing good. How are you?"
str: String = Hello I'm doing good. How are you?
scala> str.slice(6,9)
res8: String = I'm
我们知道,字符串索引从零开始。这里 from-index = 6 表示 till-index = 9(它是排他性的,所以我们只需要考虑 till index = 8)字符串的子字符串函数与切片函数的工作原理相同,如下所示:
scala> str.substring(6,9)
res12: String = I'm
这里 str.slice(6,9) 和 str.substring(6,9) 返回相同的值。slice Vs substring String 类的切片和子字符串函数之间的区别
- 从功能和语法上来说没有区别
- 性能几乎相似,可以忽略不计。
注意:-在 Scala 中,我们可以像数组元素一样访问字符串字符,如下所示:
scala> str(0)
res0: Char = H
这里返回的是 Char,而不是 String
scala> str(-1)
java.lang.StringIndexOutOfBoundsException: String index out of range: -1
at java.lang.String.charAt(String.java:658)
at scala.collection.immutable.StringOps$.apply$extension(StringOps.scala:38)
... 33 elided
scala> str.length
res2: Int = 34
scala> str(34)
java.lang.StringIndexOutOfBoundsException: String index out of range: 34
at java.lang.String.charAt(String.java:658)
at scala.collection.immutable.StringOps$.apply$extension(StringOps.scala:38)
... 33 elided
注意:-如果我们尝试访问超出范围的字符串字符,则会得到 StringIndexOutOfBoundsException,如上所示。字符串的字符访问返回 Char,而子字符串和切片函数返回 String,如下所示。
scala> str(0)
res4: Char = H
scala> str.substring(0,1)
res5: String = H
scala> str.slice(0,1)
res6: String = H
这就是“Scala 的切片函数”用法的全部内容。我们将在后续文章中讨论更多 Scala 概念。参考:Scala API 文档