Scala tutorial
Resumรฉ af Scala-tutorial
Denne scala-tutorial dรฆkker alle aspekter og emner af scala. Du vil lรฆre alt det grundlรฆggende fra bunden som Hvad er scala, installationsprocessen for scala, Scala-programmer, Scala-funktioner, Lazy-evaluering, Typegrรฆnseflade, klasser og objekter, Arv, Abstraktioner, Java og skalaforskelle mv.
Hvad er Scala?
Scala er et statisk skrevet programmeringssprog, der inkorporerer bรฅde funktionel og objektorienteret programmering for at รธge skalerbarheden af โโapplikationer. Scala kรธrer primรฆrt pรฅ JVM platform, og det kan ogsรฅ bruges til at skrive software til native platforme ved hjรฆlp af Scala-Native og JavaScript kรธretider gennem ScalaJs.
Scala er et skalerbart sprog, der bruges til at skrive software til flere platforme. Derfor fik den navnet "Scala". Dette sprog er beregnet til at lรธse problemerne med Java og samtidig vรฆre mere kortfattet. Oprindeligt designet af Martin Odersky, blev det udgivet i 2003.
Hvorfor lรฆre Scala
Her er de vigtigste grunde til at lรฆre Scala-programmeringssprog:
- Scala er let at lรฆre for objektorienterede programmรธrer, Java udviklere. Det er ved at blive et af de populรฆre sprog i de senere รฅr.
- Scala tilbyder fรธrsteklasses funktioner til brugerne
- Scala kan udfรธres pรฅ FMV, hvilket baner vejen for interoperabilitet med andre sprog.
- Den er designet til applikationer, der er samtidige, distribuerede og modstandsdygtige besked-drevne. Det er et af de mest krรฆvende sprog i dette รฅrti.
- Det er kortfattet, kraftfuldt sprog og kan hurtigt vokse i overensstemmelse med brugernes efterspรธrgsel.
- Det er objektorienteret og har en masse funktionelle programmeringsfunktioner, der giver udviklerne en masse fleksibilitet til at kode pรฅ den mรฅde, de รธnsker.
- Scala tilbyder mange Andetyper
- Den har mindre kedelplade, hvis du kommer fra Java
- Rammerne Lift og Play skrevet i Scala er i vรฆkstkurven.
Sรฅdan installeres Scala
For at begynde at skrive Scala-programmer skal du have det installeret pรฅ din computer. For at gรธre dette skal du besรธge deres websted https://www.scala-lang.org/download/ for at downloade den seneste version af Scala.
Ved at fรธlge linket ledes vi til to muligheder, som vi kan vรฆlge for at installere Scala pรฅ vores maskiner. Til denne Scala-tutorial downloader vi IntelliJ IDEA.
Nรฅr du besรธger downloadlinket, finder du to versioner af IntelliJ IDE.
Til denne Scala-tutorial downloader vi Community Edition, som er gratis og kommer med alt hvad du behรธver for at skrive Scala-programmer.
Trin 1) Vรฆlg Community Edition
Pรฅ siden skal du klikke pรฅ rullemenuen pรฅ Community Edition.
Det giver os mulighed for at downloade IntelliJ IDE sammen med JBR, som indeholder en JDK implementering(Java Development Kit) OpenJDK, som Scala skal bruge for at kompilere og kรธre koden.
Trin 2) Kรธr installationen
Nรฅr du har downloadet IntelliJ, skal du dobbeltklikke pรฅ det for at kรธre installationsguiden og fรธlge dialogboksen.
Trin 3) Vรฆlg en placering
Vรฆlg en placering for at installere IDE.
Hvis du tilfรฆldigvis ikke downloadede den med JDK, fรฅr vi stadig en prompt, hvor vi kan tjekke for at downloade den ved at markere afkrydsningsfeltet.
Trin 4) Klik pรฅ nรฆste
Lad de andre standardindstillinger vรฆre som de er, og klik pรฅ Nรฆste.
Trin 5) Klik pรฅ startikonet
Nรฅr installationen er fuldfรธrt, skal du kรธre IntelliJ IDE ved at klikke pรฅ dets startikon i startmenuen som et almindeligt program.
Du skal stadig gennemgรฅ et ekstra trin med at tilfรธje Scala-plugin'et til IntelliJ; det gรธr du ved at klikke pรฅ rullemenuen i konfigurationsmenuen nederst til hรธjre pรฅ skรฆrmen og vรฆlge plugin-indstillingen.
Pรฅ fanen Markedsplads vil en sรธgning efter Scala prรฆsentere pluginnet som det fรธrste resultat under Sprog-tagget.
Trin 6) Installer plugin
Klik pรฅ installer, hvilket vil fรธre pluginnet i gang med at downloade.
Trin 7) Genstart IDE
Nรฅr overfรธrslen er fuldfรธrt, bliver du bedt om at genstarte IDE, sรฅ det installerede plugin kan begynde at virke.
Efter genstart vil du finde dig selv pรฅ samme side som fรธr, da vi kรธrte IDE, men denne gang har vi allerede installeret Scala-plugin'et.
Scala Hello World-programmet
Trin 1) Vรฆlg indstillingen Opret projekt, som fรธrer os til en side, hvor vi kan vรฆlge, hvilken slags sprog vores projekt skal bruge.
Trin 2) vรฆlg Scala ved at markere afkrydsningsfeltet Scala og klik pรฅ Nรฆste.
Trin 3) Vรฆlg en placering for at gemme vores projektfil og giv vores projekt et navn.
Hvis mappen ikke eksisterer, vil IntelliJ bede os om at bede os om tilladelse til at oprette mappen. Accepter og klik pรฅ Afslut. Du vil blive fรธrt til dit Scala-projekt, som i รธjeblikket ikke har nogen Scala-kode.
Det vil tage noget tid at indlรฆse nogle indekser, sรฅ bare rolig, hvis du ikke er i stand til at gรธre noget med det samme, mens der er en statuslinje i bunden af โโdin IDE, det betyder simpelthen, at din IDE indlรฆser nogle filer, der er nรธdvendige for at kรธre Scala og hjรฆlp til IDE-autofuldfรธrelse.
Trin 4) Dernรฆst klikker vi pรฅ projektfanen til venstre for IDE og udvider, sรฅ vi kan se indholdet af vores projekt.
I รธjeblikket er projektet tomt og indeholder kun en .idea-mappe og hello-world.iml-fil genereret af IDE. Vores interessepunkt er src-mappen. Src er hvor vi gemmer kildekoden til vores projekt. Det er her, vi laver vores fรธrste Scala-fil.
Trin 5) Hรธjreklik pรฅ src for at รฅbne en menu for at oprette en ny Scala-fil.
Vi vil derefter oprette et navn til filen, i denne Scala-tutorial bruger vi hej og vรฆlger derefter fra en rullemenu, hvad der skal angives som indholdet af Scala-filen. Vรฆlg "Objekt"
Nรฅr vi gรธr dette, har vi en Scala-fil, der har et Singleton-objekt, som vi vil bruge til at kรธre vores kode.
Nu hvor du har en Scala-fil med et Hello-objekt. Du skriver dit fรธrste program ved at udvide det objekt, du har oprettet ved hjรฆlp af app-nรธgleordet.
Udvidelse af vores objekt med App fortรฆl compileren, hvilken kode der skal kรธres, nรฅr den starter dit program. Umiddelbart efter at have udvidet App, dukker en grรธn pil op i venstre side, der indikerer, at du nu kan kรธre dit program.
Inde i Hello-objektet skriver vi en funktion println(), som bruges til at udskrive teksten inde i det til konsollen. Vi kรธrer vores kode ved at klikke pรฅ den grรธnne pil.
Ved at klikke pรฅ pilen fรฅr vi muligheden Kรธr, hej, nรฅr du klikker pรฅ den, begynder vores kode at kompilere, og efter nogle sekunder vil vi se resultaterne af vores program udskrevet fra konsollen, der er indbygget i IntelliJ IDE.
Og der gรฅr vi, vi har med succes installeret Scala og kรธrt vores fรธrste program.
Hvad du kan gรธre med Scala
- Frontend webudvikling med ScalaJS
- Mobil udvikling, begge dele Android Udvikling og IOS โ med Scala Native
- Server-side biblioteker som HTTP4S, Akka-Http, Play Framework
- Internet of things bruger
- Spiludvikling
- NLP โ Natural Language Processing ved hjรฆlp af en rรฆkke biblioteker ScalaNLP
- Afprรธvning af avancerede programmeringsteknikker sรฅsom funktionel programmering og i objektorienteret programmering
- Byg en meget samtidig kommunikationsapplikation ved hjรฆlp af skuespillere et bibliotek til JVM inspireret af Erlang
- Brug det til maskinlรฆring ved hjรฆlp af biblioteker som Figaro, der laver probabilistisk programmering og Apache Spark at
Anonyme funktioner
Scala-sproget har anonyme funktioner, som ogsรฅ kaldes funktionsbogstaver. At Scala er et funktionelt sprog betyder ofte, at udviklere deler store problemer op i mange smรฅ opgaver og skaber mange funktioner til at lรธse disse problemer. For at gรธre det nemt at oprette funktioner, indeholder Scala disse funktioner, der kan vรฆre instansieret uden navn. Vi kan tildele dem direkte til variabler eller definitioner 'def' som vist i nedenstรฅende Scala-eksempel:
val multiplyByTwo = (n:Int) => n * 2 def multiplyByThree = (n:Int) => n *3
Vi kan derefter bruge den normale mรฅde, vi bruger funktioner pรฅ, ved at overfรธre parametre til dem som fรธlger.
multiplyByTwo(3) //6 multiplyByThree(4) //12
Disse metoder er nyttige, nรฅr vi รธnsker at have en ren og kortfattet kode. Vi kan bruge anonyme funktioner, nรฅr vi definerer metoder, der ikke er store og ikke krรฆver meget kode i deres krop. De er meget enkle og behรธver ikke en ceremoni for at skabe.
Disse metoder er ikke begrรฆnset til funktioner med argumenter og kan bruges til at instansiere metoder, der ikke tager nogen argumenter ind.
val sayHello = ()=>{ println("hello") }
De fleste af disse anonyme funktioner bruges i andre dele af vores kode, hvor vi skal oprette en hurtig funktion pรฅ plads.
En anden grund til, at disse funktioner ogsรฅ kaldes inline funktioner. Anvendelse af anonyme funktioner er et almindeligt mรธnster, som er gennemgรฅende brugt i samlingsbiblioteket til at udfรธre hurtige handlinger over en samling.
For eksempel har vi filtermetoden, der tager en inline-funktion/anonym funktion for at oprette en anden samling med kun elementer, der opfylder de kriterier, vi definerer i den anonyme funktion.
val myList = List(1,2,3,4,5,6,7) val myEvenList = myList.filter((n: Int) => n % 2 == 0) //List(2,4,6) val myOddList = myList.filter((n:Int) => n % 2 != 0) //List(1,3,5,7)
Her er de metoder, vi har som anonyme funktioner, dem, der kontrollerer, om den vรฆrdi, vi fรฅr fra listen, er ulige og lige og returnerer varen.
//the one checking that the value is even (n: Int) => n % 2 == 0 //the one checking that the value is odd (n:Int) => n % 2 != 0
I Scala er det ogsรฅ muligt at bruge jokertegn, hvor vores anonyme funktions parameter ikke er navngivet. For eksempel
var timesTwo = (_:Int)*2 timesTwo(5) //10
I dette scenarie navngiver vi ikke den parameter, vi sender ind. Det eneste, vi bruger en understregning til at reprรฆsentere det.
Doven evaluering
De fleste sprog evaluerer sekventielt variabler og funktionsparametre, den ene efter den anden. I Scala har vi et sรธgeord kaldet doven, som hjรฆlper med at hรฅndtere vรฆrdier, som vi ikke รธnsker skal evalueres, fรธr de er blevet refereret.
En variabel, der er markeret som doven, vil ikke blive evalueret, hvor den er defineret, det er almindeligvis kendt som ivrig evaluering, den vil kun blive evalueret, nรฅr der henvises til den senere i koden.
Dette kan vรฆre nyttigt, nรฅr evaluering af en vรฆrdi kan vรฆre en dyr beregning, hvis det ikke er tilfรฆldet, at vรฆrdien altid er nรธdvendig, kan vi spare os selv for at kรธre en dyr beregning, som kan bremse vores software ved at gรธre vores variabel doven.
lazy val myExpensiveValue = expensiveComputation
def runMethod()={
if(settings == true){
use(myExpensiveValue)
}else{
use(otherValue)
}
}
Dette er ikke den eneste use case for dovne variabler. De hjรฆlper ogsรฅ med at hรฅndtere problemer med cirkulรฆr afhรฆngighed i kode.
I tilfรฆlde af at indstillingerne er falske, behรธver vi muligvis ikke bruge myExpensiveValue, hvilket kan fรฅ os til at redde os fra at lave en dyr beregning, som hjรฆlper med at sikre, at brugerne har det godt med at bruge vores applikation, da vores andre behov kan beregnes korrekt uden at overvรฆlde RAM.
I tilfรฆlde af at indstillingerne er falske, behรธver vi mรฅske ikke bruge myExpensiveValue, hvilket kan fรฅ os til at spare os fra at lave en dyr beregning, som hjรฆlper med at sikre, at brugerne har det godt med at bruge vores applikation, da vores andre behov kan beregnes korrekt uden at overvรฆlde RAM.
Dovenskaben hjรฆlper ogsรฅ med funktionsargumenter, hvor argumenterne kun bruges, nรฅr der refereres til dem inde i funktionen. Dette koncept kaldes Call-by-name parametre.
def sometimesUsedString(someValue:String, defaultValue:=> String)={
if(someValue != null){
use(defaultValue)
}else{
use(someValue)
}
}
Mange sprog bruger call-by-value mรฅden at evaluere argumenter pรฅ. Parameteren, der sendes gennem call-by-name, vil kun blive evalueret, nรฅr det er nรธdvendigt i funktionskroppen og vil ikke blive evalueret fรธr det. Nรฅr vรฆrdien er evalueret, gemmes den og kan genbruges senere, uden at den skal revurderes. Et koncept, der er kendt som memoization.
Skriv inferens
I Scala behรธver du ikke at erklรฆre typer for hver variabel, du opretter. Dette skyldes, at Scala-kompileren kan lave typeslutning om typer baseret pรฅ evaluering af hรธjre side. Dette gรธr det muligt for din kode at vรฆre mere kortfattet - det frigรธr os fra at skrive boilerplate, hvor den forventede type er indlysende
var first:String = "Hello, " var second:String = "World" var third = first + second //the compile infers that third is of type String
Hรธjere-ordens-funktion
En hรธjere-ordens funktion er en funktion, der kan tage funktioner som argumenter og kan returnere en funktion som en returtype. I Scala betragtes funktioner som fรธrsteklasses borgere. Ved at bruge disse funktioner pรฅ denne mรฅde kan vi vรฆre meget fleksible i den slags programmer, vi kan lave. Vi kan skabe funktioner dynamisk og tilfรธre funktionalitet dynamisk til andre funktioner.
def doMathToInt(n:Int, myMathFunction:Int=>Int): Int ={
myMathFunction(n)
}
I ovenstรฅende funktion sender vi en int og en funktion, der tager en int og returnerer en int. Vi kan sende enhver funktion af denne signatur. Med signatur mener vi en funktions input og output. En signatur af Int=>Int betyder, at en funktion tager en Int som input og returnerer en Int som sit output.
En signatur pรฅ ()=>Int betyder, at en funktion ikke tager noget som dens input og returnerer en Int som sit output. Et eksempel pรฅ en sรฅdan funktion ville vรฆre en, der genererer en tilfรฆldig int for os.
def generateRandomInt()={
return scala.util.Random.nextInt()
}
Ovenstรฅende funktion har en signatur ()=>Int
Vi kan have en funktion, der har en signatur scala ()=>Enhed. Det betyder, at funktionerne ikke tager noget ind og ikke returnerer en type. Funktionen kunne vรฆre at lave en form for beregning ved at รฆndre noget til at gรธre noget forudbestemt.
Den slags metoder tilskyndes dog ikke, da de ser ud til at vรฆre en sort boks, der kan pรฅvirke et system pรฅ nogle ukendte mรฅder. De er ogsรฅ uprรธvelige. At have eksplicitte input- og outputtyper gรธr det muligt for os at rรฆsonnere om, hvad vores funktion gรธr.
En hรธjere ordens funktion kan ogsรฅ returnere en funktion.
For eksempel kunne vi lave en metode, der vil skabe en kraftfunktion, dvs. tager et tal og anvender magt til det.
def powerByFunction(n:Int):Int=>Int = {
return (x:Int)=> scala.math.pow(x,n).toInt
}
Ovenstรฅende funktion tager en int. Vores returtype er en anonym funktion, der tager en Int x, * vi bruger int x som argument for potensfunktionen.
Currying
I Scala kan vi konvertere en funktion, der tager to argumenter, til en, der tager et argument ad gangen. Nรฅr vi sender et argument ind, anvender vi det delvist og ender med en funktion, der krรฆver et argument for at fuldfรธre funktionen. Currying gรธr det muligt for os at oprette funktioner ved delvist at tilfรธje nogle argumenter.
Dette kan vรฆre nyttigt til at skabe funktioner dynamisk, fรธr vi har et komplet sรฆt af argumenter
def multiply two numbers(n:Int)(m:Int): Unit ={
return n * m
}
Hvis vi skal lave en funktion, der ganges med et bestemt tal, behรธver vi ikke oprette en anden multiplikationsmetode.
Vi kan blot kalde .curried pรฅ vores funktion ovenfor og fรฅ en funktion, der tager et argument fรธrst og returnere en delvist anvendt funktion
def multiplyTwoNumbers(n:Int)(m:Int): Unit ={
return n * m
}
var multiplyByFive = multiplyTwoNumbers(5)
multiplyByFive(4)
//returns 20
Mรธnstertilpasning
Scala har en kraftig indbygget mekanisme til at hjรฆlpe os med at kontrollere, om en variabel matcher op til bestemte kriterier, ligesom vi ville gรธre i en switch-sรฆtning i Java eller i en rรฆkke hvis/andet-udsagn. Sproget har mรธnstertilpasning, som vi kan bruge til at kontrollere, om en variabel er af en bestemt type. Mรธnstermatching i Scala er kraftfuld og kan bruges til at destrukturere de komponenter, der har en uanvendelig metode for at fรฅ felter, vi er interesserede i, direkte fra den variabel, vi matcher.
Scalas mรธnstertilpasning giver ogsรฅ en mere behagelig syntaks sammenlignet med switch statement.
myItem match {
case true => //do something
case false => //do something else
case _ => //if none of the above do this by default
}
Vi sammenligner vores variabel med et sรฆt muligheder, og nรฅr den variabel, vi matcher, opfylder kriterierne, evalueres udtrykket pรฅ hรธjre side af den fede pil (=>) og returneres som resultatet af matchningen.
Vi bruger en understregning til at fange sager, der ikke kan matche i vores kode. Det afspejler standardsagens opfรธrsel, nรฅr man hรฅndterer switch-sรฆtninger.
class Animal(var legs:Int,var sound:String)
class Furniture(var legs:Int, var color:Int, var woodType:String)
myItem match {
case myItem:Animal => //do something
case myItem:Furniture => //do something else
case _ => //case we have a type we don't recognize do sth else
}
I koden ovenfor er du i stand til at finde ud af typen af โโmyItem-variablen og baseret pรฅ denne forgrening til en bestemt kode.
Mรธnstermatching kontrollerer, om variablen matcher
Understregningen fungerer som en pladsholder, der matcher enhver anden betingelse, der ikke matches af de andre punkter i sagsudtalelserne ovenfor. Vi tager en variabel myItem og kalder matchmetoden.
- vi tjekker, om myItem er sandt ved at bruge og laver noget logik pรฅ hรธjre side af den fede pil "=>."
- vi bruger understregningen til at matche noget, der ikke stemmer overens med nogen af โโde sagsudsagn, vi har defineret i koden.
Med Case-klasser kan vi endda gรฅ lรฆngere og destrukturere klassen for at fรฅ felter inde i objektet.
Ved at bruge det forseglede sรธgeord til at definere vores klasser, fรฅr vi fordelen af โโat lade compileren udtรธmmende tjekke de sager, vi forsรธger at matche, og advare os, hvis vi glemmer at hรฅndtere en bestemt.
uforanderlighed
Det er muligt at oprette vรฆrdier, der ikke kan รฆndres af andre funktioner i Scala ved hjรฆlp af nรธgleordet val. Dette opnรฅs i Java ved at bruge det endelige sรธgeord. I Scala gรธr vi det ved at bruge et val nรธgleord, nรฅr vi opretter en variabel i stedet for at bruge var, som er det alternativ, vi ville bruge til at skabe en variabel variabel.
En variabel, der er defineret ved hjรฆlp af nรธgleordet val, er skrivebeskyttet, hvorimod en, der er defineret med var, kan lรฆses og รฆndres af andre funktioner eller vilkรฅrligt af brugeren i koden.
var changeableVariable = 8 changeableVariable =10 //the compiler doesn't complain, and the code compiles successfully println(changeableVariable) //10 val myNumber = 7 myNumber = 4 //if we try this the code won't compile
At forsรธge at tildele en vรฆrdi til myNumber, efter at vi har erklรฆret den som en val, giver en kompileringsfejl eller "omtildeling til val."
Hvorfor bruge uforanderlighed?
Uforanderlighed hjรฆlper os med at forhindre kode og andre programmรธrer i at รฆndre vores vรฆrdier uventet, hvilket ville fรธre til uventede resultater, hvis de er beregnet til at bruge den vรฆrdi, vi gemmer, kan de i stedet lave en kopi af den. Pรฅ denne mรฅde forhindres fejl, der kan vรฆre forรฅrsaget af flere aktรธrer, der รฆndrer den samme variabel.
Klasser og objekter
Vi ved alle, at objekter er enheder i den virkelige verden, og klasse er en skabelon, der definerer objekter. Klasser har bรฅde tilstand og adfรฆrd. Tilstandene er enten vรฆrdier eller variable. Adfรฆrden er metoderne i Scala.
Lad os se pรฅ, hvordan du kan definere en klasse, instansiere den og bruge den ved hjรฆlp af Scala.
Her er klassen kaldet Rectangle, som har to variable og to funktioner. Du kan ogsรฅ bruge parametrene l og b direkte som felter i programmet. Du har et objekt, som har en hovedmetode og har instansieret klassen med to vรฆrdier.
Eksempel:
class Rectangle( l: Int, b: Int) {
val length: Int = l
val breadth: Int = b
def getArea: Int = l * b
override def toString = s"This is rectangle with length as $length and breadth as $breadth"
}
object RectObject {
def main(args: Array[String]) {
val rect = new Rectangle(4, 5)
println(rect.toString)
println(rect.getArea)
}
}
Alle felter og metode er som standard offentlige i Scala. Det er vigtigt at bruge tilsidesรฆttelse, fordi toString-metoden er defineret for Object i Scala.
Arv
Scala har flere typer af arv (som enkelt, multi-level, multiple, hierarkisk, hybrid), der har meget til fรฆlles med traditionelle former, der findes i Java. Du kan arve bรฅde fra klasser og karaktertrรฆk. Du kan arve medlemmerne af en klasse til en anden klasse ved at bruge nรธgleordet "forlรฆnger". Dette muliggรธr genbrug.
Det er muligt at arve fra รฉn klasse eller flere klasser. Det er ogsรฅ muligt at arve fra underklasser, der selv har deres superklasser, hvilket skaber et hierarki af arv i processen.
I nedenstรฅende Scala-eksempel er Base-klassen Circle, og den afledte klasse er Sphere. En cirkel har en vรฆrdi kaldet radius, som er nedarvet i Sphere-klassen. Metoden calcArea tilsidesรฆttes ved hjรฆlp af nรธgleordet tilsidesรฆttelse.
Eksempel:
class Circle {
val radius = 5;
def calcArea = {
println(radius * radius )
}
}
class Sphere extends Circle{
override def calcArea = {
println(radius * radius * radius )
}
}
object SphereObject{
def main(args : Array[String]){
new Sphere().calcArea
}
}
abstraktion
I Scala kan vi skabe abstrakte metoder og medlemsfelter ved hjรฆlp af abstrakte klasser og trรฆk. Inde i abstrakte klasser og trรฆk kan vi definere abstrakte felter uden nรธdvendigvis at implementere dem.
Eksempel:
trait MakesSound{
var nameOfSound:String
def sound():String
}
abstract class HasLegs(var legs:Int){
val creatureName:String
def printLegs():String={
return s"$creatureName has this number of legs: $legs"
}
}
Disse felter er implementeret af de klasser, der udvider egenskaben eller den abstrakte klasse. Du kan bruge egenskaber til at oprette kontrakter om, hvad vores applikation skal kunne og derefter implementere disse metoder senere.
trait DatabaseService{
def addItemName(itemName:String)
def removeItem(itemId:Int)
def updateItem(itemId:Int, newItemName:String)
}
Pรฅ denne mรฅde kan vi planlรฆgge, hvordan vores applikation vil se ud uden at implementere de metoder, som kan hjรฆlpe os med at forestille os, hvordan forskellige metoder vil se ud. Det fรธlger et mรธnster kendt som programmering til abstraktioner og ikke den faktiske implementering.
Klassen, som indledes med nรธgleordet abstrakt, kan indeholde bรฅde abstrakte og ikke-abstrakte metoder. Men flere nedarvninger understรธttes ikke i abstrakt klasse. Sรฅ du kan hรธjst forlรฆnge รฉn abstrakt klasse.
Singleton objekter
En Singleton er en klasse, der kun instansieres รฉn gang i et program. Det er fra et populรฆrt og nyttigt programmeringsmรธnster kendt som "singleton-mรธnsteret". Det er nyttigt til at skabe forekomster, der er beregnet til at vรฆre langtidsholdbare og vil vรฆre almindeligt tilgรฆngelige i hele dit program, hvis tilstand er integreret i koordineringen af โโbegivenhederne i et system. Det er nemt at oprette en sรฅdan klasse i Scala, da Scala giver os en enkel mรฅde at oprette singletons ved hjรฆlp af objekt-nรธgleordet.
object UserProfile{
var userName=""
var isLoggedIn:Boolean = false
}
Vi kan derefter henvise til dette objekt i hele vores program med garanti for, at alle dele af vores program vil se de samme data, da der kun er รฉn forekomst af det.
def getLoggedInStatus():Boolean={
return UserProfile.isLoggedIn
}
def changeLoggedInStatus():Boolean={
UserProfile.isLoggedIn = !UserProfile.isLoggedIn
return UserProfile.isLoggedIn
}
Konceptet med statiske medlemmer er der ikke i Scala, det er grunden til, at du skal bruge singleton-objekter, som fungerer som statiske medlemmer af en klasse.
Implicitte klasser
Implicitte klasser er den nye funktionalitet tilfรธjet efter version 2.1. Det er primรฆrt for at tilfรธje ny funktionalitet til de lukkede klasser.
Det implicitte nรธgleord skal defineres i en klasse, et objekt eller et trรฆk. Den primรฆre konstruktรธr af en implicit klasse skal have prรฆcis รฉt argument i sin fรธrste parameterliste. Den kan ogsรฅ indeholde en ekstra implicit parameterliste.
I nedenstรฅende Scala-eksempel tilfรธjes ny funktionalitet til at erstatte vokaler i en streng med *.
object StringUtil {
implicit class StringEnhancer(str: String) {
def replaceVowelWithStar: String = str.replaceAll("[aeiou]", "*")
}
}
Du skal importere i den klasse, hvor du bruger det.
import StringUtil.StringEnhancer
object ImplicitEx extends App {
val msg = "This is Guru99!"
println(msg.replaceVowelWithStar)
}
Objektorienteret programmering (OOP) vs. funktionel programmering (FP)
I OOP er programmer konstrueret ved at gruppere data og de funktioner, der fungerer pรฅ disse data, i stรฆrkt forbundne enheder. Objekter bรฆrer deres data i de felter og metoder, der opererer pรฅ dem. I denne programmeringsstil er hovedabstraktionen dataene, da de metoder, der oprettes, er beregnet til at operere pรฅ dataene.
Funktionel programmering, pรฅ den anden side adskiller data og de funktioner, der opererer pรฅ dataene. Dette gรธr det muligt for udviklere at behandle funktioner som abstraktionen og drivkraften ved modellering af programmer.
Scala muliggรธr funktionel programmering ved at have funktioner som fรธrsteklasses borgere, sรฅ de kan overfรธres som vรฆrdier til andre funktioner og ogsรฅ returneres som vรฆrdier. Kombinationen af โโdisse to paradigmer har gjort Scala til et godt valg til at bygge kompleks software i forskellige brancher, sรฅsom Data Science.
Vigtige rammer pรฅ Scala
Her er nogle vigtige rammer for Scala
- Leg er en open source webapplikationsramme, der bruger MVC arkitektur. Udgivet i 2007 og nu licenseret under Apache, blev det det mest populรฆre framework pรฅ GitHub i 2013. Virksomheder som LinkedIn, Walmart, Samsung, Eero bruger dette framework.
- Elevator er et andet gratis web-framework skrevet i Scala, lanceret i 2007. Foursquare bruger Lift-rammen. Det er hรธjtydende, hurtigere at bygge rammer.
- Som
- Katte
- Spark
Samtidig support
- Vรฆrdierne i Scala er som standard uforanderlige. Dette gรธr det meget tilpasningsdygtigt til det samtidige miljรธ.
- Der er mange funktioner i Scala, der gรธr den bedst til samtidige applikationer.
- Futures and Promises gรธr det lettere at behandle data asynkront og understรธtter dermed parallelitet.
- Akka โ vรฆrktรธjssรฆt, der bruger Actor samtidighedsmodel. Der er en rรฆkke skuespillere, der handler, nรฅr de modtager beskeder.
- Samtidig brug af trรฅde fra Java kan ogsรฅ understรธttes i Scala.
- Streambehandling er en anden fantastisk funktion, der muliggรธr kontinuerlig realtidsbehandling af data.
Scala har nogle af de bedste samtidighedsbiblioteker i Java รธkosystem.
- Native Java trรฅde
- Fibre fra biblioteker som Vertex
- ZIO โ et bibliotek, der har primitiver til at hjรฆlpe os med at hรฅndtere samtidighed og asynkron beregning
- STM โ Transaktion
- Fremtid โ indbygget i Scala-sproget
Java vs. Scala
Her er de vigtigste forskel mellem Java og Scala.
| Scala | Java |
|---|---|
| Mere kompakt og kortfattet | Forholdsvis stรธrre bidder af kode |
| Designet og udviklet til at vรฆre bรฅde objekt- og funktionsorienteret sprog. Understรธtter en lang rรฆkke funktionelle programmeringsfunktioner sรฅsom samtidighed, uforanderlighed. |
Oprindeligt udviklet som et objektorienteret sprog og begyndte at understรธtte funktionelle programmeringsfunktioner i de seneste dage. Stadig er ikke stรฆrk som et funktionelt programmeringssprog. |
| Bruger skuespillermodel til at understรธtte samtidighed, som er moderne | Bruger den konventionelle trรฅdbaserede model til samtidighed. |
| Understรธtter rammer โ leg, lรธft | Understรธtter fjeder, grale, meget mere |
| Understรธtter doven evaluering | Understรธtter ikke doven evaluering |
| Ingen statiske medlemmer | Indeholder statiske medlemmer |
| Understรธtter operatรธroverbelastning | Understรธtter ikke operatรธroverbelastning |
| Kompilering af kildekode er forholdsvis langsom | Kompilering af kildekode er hurtigere end Scala |
| Trรฆk โ opfรธr dig som Java 8 grรฆnseflader | Java 8 grรฆnseflader forsรธger at bygge bro mellem klasser og grรฆnseflader |
| Omskrivning er nรธdvendig | Genskrivning er ikke pรฅkrรฆvet |
| Ingen sikkerhed for de fejlfrie koder | Fuldstรฆndig sikkerhed for mindre defekter |
| Understรธtter bagudkompatibilitet. | Scala understรธtter ikke bagudkompatibilitet. |
| Operators behandles forskelligt i Java og er ikke metodekald. | Alle operatรธrer pรฅ indtastninger er via en metode kaldet i Scala. |
| Understรธtter flere arv ved brug af klasser, men ikke af abstrakte klasser | Understรธtter ikke flere nedarvninger ved hjรฆlp af klasser, men efter grรฆnseflader |
| Koden er skrevet i en kompakt form. | Koden er skrevet i lang form. |
| Scala indeholder ikke det statiske sรธgeord. | Java indeholder det statiske nรธgleord. |
Resumรฉ
I denne vejledning har du lรฆrt, hvordan du kommer i gang med Scala. Du har ogsรฅ lรฆrt de funktionelle og objektorienterede funktioner. Du har ogsรฅ opdaget lighederne og forskellene mellem Java og Scala. Denne tutorial burde have hjulpet dig med en lang rรฆkke eksempler, der er godt demonstreret.






















