Vandaag zullen we de Scala slice-functie bekijken.
Scala slice
De Scala slice-functie is beschikbaar in de volgende API-klassen:
- Scala Array API
- String API
- Scala Collection API
We zullen elke API oppakken en ze grondig bespreken met geschikte voorbeelden in de volgende sectie.
Gebruik van de Scala slice-functie
In de Scala API wordt de ‘slice’-functie gebruikt om een interval van elementen te selecteren. Het neemt twee parameters van het type “Int” en geeft een subset, het geheel of geen element(en) van de oorspronkelijke collectie (of string of array) terug. Echt wereldslicescenario:- We kunnen deze slice-functie ook gebruiken in ons reguliere dagelijkse leven, zoals hieronder wordt getoond. Hier betekent Bread.slice(0,10) dat we broodslices nemen van 0 tot 9, dus in totaal 10 broodslices. (Om hier de Scala-slice-functie te weerspiegelen, gebruik ik nul, maar stel dit voor als één.) Slicesyntax: In de Scala Standard Library (API) is deze slice-functie als volgt gedefinieerd:
def slice(from-index: Int, until-index: Int): ScalaAPIClass[A]
Hier betekent “ScalaAPIClass” elke Scala-collectieklasse (die indexgebaseerde toegang ondersteunt zoals Seq, List, enz.), String, Array-klassen. Voorbeeld:- De volgende functie is gedefinieerd in de Seq-klasse van de Scala API.
def slice(from-index: Int, until-index: Int): Seq[A]
Parameters van de slicefunctie: Het gebruik van de parameters van de “slice”-functie wordt beschreven in de volgende tabel:
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). |
De slicefunctie haalt elementen op vanaf ‘eerste-index’ (inclusief) tot ’tot-index’ (exclusief). Hier zijn de elementnummers voor een array van getallen, karakters voor een string, een object voor een collectie.
Scala Array Slice
In de Scala API definieert de Array-klasse de slicefunctie als volgt:
def slice(from: Int, until: Int): Array[T]
Hier is ‘from’ de startindex (inclusief) van de array en ‘until’ is de eindindex (exclusief) van de array. Voorbeelden van Array-slice Functie:
scala> val marksArray = Array(56,79,60,99,71)
marksArray: Array[Int] = Array(56, 79, 60, 99, 71)
Int van Array met 5 waarden worden aangemaakt, dus de startwaarde van de index is 0 en de eindwaarde van de index is 4. De lengte is 5. Laten we nu met de slicefunctie spelen.
scala> marksArray.slice(0,2)
res0: Array[Int] = Array(56, 79)
Het begint met index 0, dat is het eerste element, en haalt alle elementen op tot 2, wat betekent index = 1, daarom krijgen we hier het 0e en 1e element.
scala> marksArray.slice(3,4)
res1: Array[Int] = Array(99)
We kunnen toegang krijgen tot elk indicesbereik.
scala> marksArray.slice(3,3)
res2: Array[Int] = Array()
Als we dezelfde waarden geven voor start en einde zoals hierboven, krijgen we een lege array, waarom? Startindex = 3 Eindindex = 3 – 1 = 2 Het is niet mogelijk om een set elementen op te halen uit een array van 3 tot 2 indices, toch?
scala> marksArray.slice(-1,3)
res3: Array[Int] = Array(56, 79, 60)
Als we negatieve waarden geven, begint het gewoon met de beschikbare index zoals hierboven getoond.
scala> marksArray.slice(0,5)
res4: Array[Int] = Array(56, 79, 60, 99, 71)
Als we de waarde van de tweede parameter geven die voorbij de beschikbare index ligt zoals hierboven getoond (Beschikbare maximale indexwaarde in marksArray is slechts 4 omdat de lengte 5 is), negeert het gewoon die waarde en retourneert het alleen tot de beschikbare index. OPMERKING: – In tegenstelling tot Java gooit het geen ArrayIndexOutOfBoundsException.
Scala-collectie-slice
In de standaard-API van Scala definieert de meeste klassen deze slicefunctie die toegang biedt tot op index gebaseerde elementen. Bijvoorbeeld, de klasse List definieert deze functie als volgt:
def slice(from: Int, until: Int): List[A]
Voorbeelden van de lijst slice functie: Net als bij de voorbeelden van Arrays, zullen we dezelfde resultaten krijgen voor elke 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)
Als we toegang hebben tot een lege lijst, krijgen we alleen een lege lijst zoals hieronder weergegeven
scala> val list2 = List()
list2: List[Nothing] = List()
scala> list2.slice(0,1)
res10: List[Nothing] = List()
Scala String slice
In de Scala API is de klasse “StringOps” gedefinieerd in het scala.collection.immutable pakket. Het definieert de slice functie zoals hieronder weergegeven:
def slice(from: Int, until: Int): String
LET OP:- In Scala gebruiken we de String klasse van Java. Maar deze klasse heeft GEEN slice functie. Wanneer we de slice functie gebruiken op Java’s String objecten, converteert de Scala-compiler dit String object intern naar een StringOps klasse-object om deze slice functie te gebruiken. (Niet alleen slice functie nog veel meer. Zie Scala API voor meer informatie.) Dat betekent dat “StringOps” een impliciete klasse is van de String klasse. Voorbeelden van de String slice functie:
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
Zoals we weten begint de index van een String met nul. Hier betekent vanaf-index = 6 tot-index = 9 (Het is exclusief dus we moeten alleen index tot 8 overwegen) De substring-functie van String werkt hetzelfde als de slice functie zoals hieronder weergegeven:
scala> str.substring(6,9)
res12: String = I'm
Hier geven zowel str.slice(6,9) als str.substring(6,9) dezelfde waarde terug. slice Vs substring Verschil tussen de slice en substring functies van de String klasse
- Wat betreft functionaliteit en syntaxis is er geen verschil
- De prestaties zijn bijna vergelijkbaar en verwaarloosbaar.
OPMERKING:- In Scala kunnen we toegang krijgen tot tekens van een String net als de elementen van een Array, zoals hieronder getoond:
scala> str(0)
res0: Char = H
Hiermee wordt een Char geretourneerd, maar geen 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
OPMERKING:- Als we proberen toegang te krijgen tot tekens van een String buiten het bereik, krijgen we een StringIndexOutOfBoundsException zoals hierboven getoond. De toegang tot tekens van een String retourneert een Char, terwijl de functies substring en slice een String retourneren zoals hieronder getoond.
scala> str(0)
res4: Char = H
scala> str.substring(0,1)
res5: String = H
scala> str.slice(0,1)
res6: String = H
Dat is alles over het gebruik van de “slice-functie” in Scala. We zullen wat meer Scala-concepten bespreken in mijn komende berichten. Referentie: Scala API Doc
Source:
https://www.digitalocean.com/community/tutorials/scala-slice-function