今天我們將深入研究Scala的切片功能。
Scala切片
Scala切片功能可在以下API類中使用:
我們將選擇每個API,並在下一節中使用適當的例子進行深入討論。
Scala切片功能用法
在Scala API中,’slice’ 函数用于选择一个元素区间。它接受两个“Int”类型的参数,并返回原始集合(或字符串或数组)的子集、整个元素或没有元素。现实世界中的切片场景:我们也可以在我们日常生活中使用这个切片函数,如下所示。这里的Bread.slice(0,10)表示从0到9取面包片,总共10片面包。(这里我使用零来代表Scala的切片函数,但请将其视为一)切片函数的语法:在Scala标准库(API)中,该切片函数定义如下:
def slice(from-index: Int, until-index: Int): ScalaAPIClass[A]
这里的“ScalaAPIClass”表示任何支持索引访问的Scala集合类(如Seq、List等),字符串、数组类。示例:以下函数在Scala API的Seq类中定义。
def slice(from-index: Int, until-index: Int): Seq[A]
切片函数参数:切片函数参数的用法如下表所示:
S.No. | Function Params | Usage |
---|---|---|
1. | First Parameter | Starting index (Inclusive). It should be zero or any any positive integer less than the length of the Collection or String or Array. |
2. | Second Parameter | Ending index (Exclusive). |
切片函数从’first-index’(包括)开始提取元素,直到’until-index’(不包括)为止。这里的元素编号是指数字数组的元素编号,字符串的字符编号,集合的对象编号。
Scala数组切片
在Scala API中,Array类定义了以下切片函数:
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個值的整數陣列,因此其起始索引值為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)
如果我們給出負值,它將從可用索引開始,就像上面顯示的一樣。
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]
列表切片函數示例:與數組示例相同,對於任何集合 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包中。它定義了如下的切片函數:
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
正如我們所知,字符串索引從零開始。這裡的從索引 = 6 意味著到索引 = 9(它是排他的,所以我們只需考慮到索引 = 8)字符串的substring函數與它的切片函數相同,如下所示:
scala> str.substring(6,9)
res12: String = I'm
這裡的str.slice(6,9)和str.substring(6,9)都返回相同的值。 切片 Vs substring 字符串類的切片和substring函數的區別
- 在功能上和語法上沒有區別
- 性能幾乎相似且可以忽略。
注意:-在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,而substring和slice函數返回String,如下所示。
scala> str(0)
res4: Char = H
scala> str.substring(0,1)
res5: String = H
scala> str.slice(0,1)
res6: String = H
這就是關於“Scala的slice函數”的使用。在我接下來的帖子中,我們將討論更多Scala概念。參考:Scala API文檔
Source:
https://www.digitalocean.com/community/tutorials/scala-slice-function