Scala 切片功能

今天我們將深入研究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