Scala handledning
Sammanfattning av Scala handledning
Denna scala-handledning tรคcker alla aspekter och รคmnen av scala. Du kommer att lรคra dig alla grunderna frรฅn grunden som Vad รคr scala, installationsprocessen fรถr scala, Scala-program, Scala-funktioner, Lazy utvรคrdering, Typgrรคnssnitt, klasser och objekt, Arv, Abstraktioner, Java och skalaskillnader osv.
Vad รคr Scala?
Skala รคr ett statiskt typat programmeringssprรฅk som innehรฅller bรฅde funktionell och objektorienterad programmering fรถr att รถka skalbarheten av applikationer. Scala kรถrs frรคmst pรฅ JVM-plattformen och den kan ocksรฅ anvรคndas fรถr att skriva mjukvara fรถr inbyggda plattformar med Scala-Native och JavaScript kรถrtider genom ScalaJs.
Scala รคr ett skalbart sprรฅk som anvรคnds fรถr att skriva programvara fรถr flera plattformar. Dรคrfรถr fick den namnet "Scala". Detta sprรฅk รคr avsett att lรถsa problemen med Java samtidigt som den รคr mer koncis. Ursprungligen designad av Martin Odersky, den slรคpptes 2003.
Varfรถr lรคra sig Scala
Hรคr รคr de frรคmsta anledningarna till att lรคra sig Scala programmeringssprรฅk:
- Scala รคr lรคtt att lรคra sig fรถr objektorienterade programmerare, Java utvecklare. Det hรฅller pรฅ att bli ett av de populรคra sprรฅken de senaste รฅren.
- Scala erbjuder fรถrstklassiga funktioner fรถr anvรคndare
- Scala kan kรถras pรฅ JVM, vilket banar vรคg fรถr interoperabilitet med andra sprรฅk.
- Den รคr designad fรถr applikationer som รคr samtidiga, distribuerade och motstรฅndskraftiga meddelandestyrda. Det รคr ett av de mest krรคvande sprรฅken under detta รฅrtionde.
- Det รคr kortfattat, kraftfullt sprรฅk och kan snabbt vรคxa i enlighet med anvรคndarnas efterfrรฅgan.
- Den รคr objektorienterad och har mรฅnga funktionella programmeringsfunktioner som ger utvecklarna mycket flexibilitet att koda pรฅ det sรคtt de vill.
- Scala erbjuder mรฅnga anktyper
- Den har mindre pannplรฅt om du kommer ifrรฅn Java
- Ramverken Lift och Play skrivna i Scala ligger i tillvรคxtkurvan.
Hur man installerar Scala
Fรถr att bรถrja skriva Scala-program mรฅste du ha det installerat pรฅ din dator. Fรถr att gรถra detta mรฅste du besรถka deras webbplats https://www.scala-lang.org/download/ fรถr att ladda ner den senaste versionen av Scala.
Genom att fรถlja lรคnken leds vi till tvรฅ alternativ som vi kan vรคlja fรถr att installera Scala pรฅ vรฅra maskiner. Fรถr denna Scala-handledning laddar vi ner IntelliJ IDEA.
Nรคr du besรถker nedladdningslรคnken hittar du tvรฅ versioner av IntelliJ IDE.
Fรถr denna Scala-handledning laddar vi ner Community Edition, som รคr gratis och kommer med allt du behรถver fรถr att skriva Scala-program.
Steg 1) Vรคlj Community Edition
Pรฅ sidan klickar du pรฅ rullgardinsmenyn i Community Edition.
Det ger oss ett alternativ att ladda ner IntelliJ IDE tillsammans med JBR som innehรฅller en JDK-implementering(Java Development Kit) OpenJDK som Scala behรถver fรถr att kompilera och kรถra koden.
Steg 2) Kรถr installationen
Nรคr du har laddat ner IntelliJ, dubbelklicka pรฅ den fรถr att kรถra installationsguiden och fรถlj dialogrutan.
Steg 3) Vรคlj en plats
Vรคlj en plats fรถr att installera IDE.
Om du av en slump inte laddade ner den med JDK, fรฅr vi fortfarande en uppmaning dรคr vi kan kontrollera att ladda ner den genom att markera kryssrutan.
Steg 4) Klicka pรฅ nรคsta
Lรคmna de andra standardinstรคllningarna som de รคr och klicka pรฅ Nรคsta.
Steg 5) Klicka pรฅ startikonen
Nรคr installationen รคr klar, kรถr IntelliJ IDE genom att klicka pรฅ dess startikon i startmenyn som ett vanligt program.
Du mรฅste fortfarande gรฅ igenom ytterligare ett steg fรถr att lรคgga till Scala-plugin till IntelliJ; du gรถr det genom att klicka pรฅ rullgardinsmenyn pรฅ konfigureringsmenyn lรคngst ner till hรถger pรฅ skรคrmen och vรคlja plugin-alternativet.
Pรฅ fliken Marketplace kommer en sรถkning efter Scala att presentera plugin som det fรถrsta resultatet under sprรฅktaggen.
Steg 6) Installera plugin
Klicka pรฅ installera, vilket leder till att plugin-programmet bรถrjar ladda ner.
Steg 7) Starta om IDE
Nรคr nedladdningen รคr klar kommer du att uppmanas att starta om IDE sรฅ att det installerade insticksprogrammet kan bรถrja fungera.
Efter omstart kommer du att hamna pรฅ samma sida som tidigare nรคr vi kรถrde IDE, men den hรคr gรฅngen har vi redan installerat Scala plugin.
Scala Hello World-programmet
Steg 1) Vรคlj alternativet Skapa projekt, vilket leder oss till en sida dรคr vi kan vรคlja vilken typ av sprรฅk vรฅrt projekt ska anvรคnda.
Steg 2) vรคlj Scala genom att markera kryssrutan Scala och klicka pรฅ nรคsta.
Steg 3) Vรคlj en plats fรถr att spara vรฅr projektfil och ge vรฅrt projekt ett namn.
Om katalogen inte finns kommer IntelliJ att uppmana oss att be oss om tillรฅtelse att skapa mappen. Acceptera och klicka pรฅ Slutfรถr. Du kommer att tas till ditt Scala-projekt, som fรถr nรคrvarande inte har nรฅgon Scala-kod.
Det kommer att ta lite tid att ladda nรฅgra index sรฅ oroa dig inte om du inte kan gรถra nรฅgot omedelbart medan det finns en fรถrloppsindikator lรคngst ner pรฅ din IDE, det betyder helt enkelt att din IDE laddar nรฅgra filer som krรคvs fรถr att kรถra Scala och hjรคlp med IDE-autokomplettering.
Steg 4) Dรคrefter klickar vi pรฅ projektfliken till vรคnster om IDE och expanderar sรฅ att vi kan se innehรฅllet i vรฅrt projekt.
Fรถr tillfรคllet รคr projektet tomt och innehรฅller bara en .idea-mapp och hello-world.iml-fil genererad av IDE. Vรฅrt intresse รคr src-mappen. Src รคr dรคr vi lagrar kรคllkoden fรถr vรฅrt projekt. Det รคr dรคr vi skapar vรฅr fรถrsta Scala-fil.
Steg 5) Hรถgerklicka pรฅ src fรถr att รถppna en meny fรถr att skapa en ny Scala-fil.
Vi kommer sedan att skapa ett namn fรถr filen, i denna Scala-handledning anvรคnder vi hej och vรคljer sedan frรฅn en rullgardinsmeny vad som ska lรคggas till som innehรฅll i Scala-filen. Vรคlj "Objekt"
Nรคr vi gรถr detta har vi en Scala-fil som har ett Singleton-objekt som vi kommer att anvรคnda fรถr att kรถra vรฅr kod.
Nu nรคr du har en Scala-fil med ett Hello-objekt. Du kommer att skriva ditt fรถrsta program genom att utรถka objektet du har skapat med hjรคlp av nyckelordet App.
Om du utรถkar vรฅrt objekt med App berรคtta fรถr kompilatorn vilken kod som ska kรถras nรคr den startar ditt program. Omedelbart efter att du har utรถkat appen visas en grรถn pil pรฅ vรคnster sida, vilket indikerar att du nu kan kรถra ditt program.
Inuti Hello-objektet skriver vi en funktion println() som anvรคnds fรถr att skriva ut texten inuti det till konsolen. Vi kรถr vรฅr kod genom att klicka pรฅ den grรถna pilen.
Genom att klicka pรฅ pilen fรฅr vi alternativet Kรถr, hej, nรคr du klickar pรฅ det kommer vรฅr kod att bรถrja kompileras och efter nรฅgra sekunder kommer vi att se resultaten av vรฅrt program utskrivna frรฅn konsolen som รคr inbyggd i IntelliJ IDE.
Och dรคr gรฅr vi, vi har framgรฅngsrikt installerat Scala och kรถrt vรฅrt fรถrsta program.
Vad du kan gรถra med Scala
- Frontend webbutveckling med ScalaJS
- Mobil utveckling, bรฅda Android Utveckling och IOS โ med Scala Native
- Bibliotek pรฅ serversidan som HTTP4S, Akka-Http, Play Framework
- Internet of things anvรคnder
- Spelutveckling
- NLP โ Natural Language Processing med hjรคlp av en uppsรคttning bibliotek ScalaNLP
- Testa avancerade programmeringstekniker som funktionell programmering och i objektorienterad programmering
- Bygg mycket samtidig kommunikationsapplikation med hjรคlp av skรฅdespelare ett bibliotek fรถr JVM inspirerat av Erlang
- Anvรคnd den fรถr maskininlรคrning med hjรคlp av bibliotek som Figaro som gรถr probabilistisk programmering och Apache Spark den dรคr
Anonyma funktioner
Scala-sprรฅket har anonyma funktioner, som ocksรฅ kallas funktionsliteral. Att Scala รคr ett funktionellt sprรฅk innebรคr ofta att utvecklare bryter ner stora problem i mรฅnga smรฅ uppgifter och skapar mรฅnga funktioner fรถr att lรถsa dessa problem. Fรถr att gรถra det enkelt att skapa funktioner innehรฅller Scala dessa funktioner som kan vara instansierat utan namn. Vi kan tilldela dem direkt till variabler eller definitioner 'def' som visas i nedanstรฅende Scala-exempel:
val multiplyByTwo = (n:Int) => n * 2 def multiplyByThree = (n:Int) => n *3
Vi kan sedan anvรคnda det normala sรคttet vi anvรคnder funktioner genom att skicka parametrar till dem som fรถljer.
multiplyByTwo(3) //6 multiplyByThree(4) //12
Dessa metoder kommer vรคl till pass nรคr vi vill ha en ren och koncis kod. Vi kan anvรคnda anonyma funktioner nรคr vi definierar metoder som inte รคr stora och inte krรคver mycket kod i kroppen. De รคr vรคldigt enkla och behรถver ingen ceremoni fรถr att skapa.
Dessa metoder รคr inte begrรคnsade till funktioner med argument och kan anvรคndas fรถr att instansiera metoder som inte tar in nรฅgra argument.
val sayHello = ()=>{ println("hello") }
De flesta av dessa anonyma funktioner anvรคnds i andra delar av vรฅr kod dรคr vi behรถver skapa en snabbfunktion pรฅ plats.
En annan anledning till att dessa funktioner ocksรฅ kallas inline-funktioner. Att anvรคnda anonyma funktioner รคr ett vanligt mรถnster som anvรคnds genomgรฅende i samlingsbiblioteket fรถr att utfรถra snabba รฅtgรคrder รถver en samling.
Till exempel har vi filtermetoden som tar en inline-funktion/anonym funktion fรถr att skapa ytterligare en samling med bara element som uppfyller kriterierna vi definierar i den anonyma funktionen.
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)
Hรคr รคr metoderna vi har som anonyma funktioner de som kontrollerar om vรคrdet vi fรฅr frรฅn listan รคr udda och jรคmnt och returnerar varan.
//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 รคr det ocksรฅ mรถjligt att anvรคnda jokertecken dรคr parametern fรถr vรฅr anonyma funktion inte รคr namngiven. Till exempel
var timesTwo = (_:Int)*2 timesTwo(5) //10
I det hรคr scenariot namnger vi inte parametern vi skickar in. Det enda vi anvรคnder ett understreck fรถr att representera den.
Lat utvรคrdering
De flesta sprรฅk utvรคrderar sekventiellt variabler och funktionsparametrar, en efter en. I Scala har vi ett nyckelord som heter lazy, som hjรคlper till att hantera vรคrden som vi inte vill ska utvรคrderas fรถrrรคn de har refererats.
En variabel markerad som lat kommer inte att utvรคrderas dรคr den รคr definierad, det รคr allmรคnt kรคnd som ivrig utvรคrdering, den kommer bara att utvรคrderas nรคr den refereras till nรฅgon senare i koden.
Detta kan vara till hjรคlp nรคr utvรคrdering av ett vรคrde kan vara en dyr berรคkning, om det inte รคr sรฅ att vรคrdet alltid behรถvs kan vi rรคdda oss sjรคlva frรฅn att kรถra en dyr berรคkning som kan sakta ner vรฅr programvara genom att gรถra vรฅr variabel lat.
lazy val myExpensiveValue = expensiveComputation
def runMethod()={
if(settings == true){
use(myExpensiveValue)
}else{
use(otherValue)
}
}
Detta รคr inte det enda anvรคndningsfallet fรถr lata variabler. De hjรคlper ocksรฅ till att hantera frรฅgor om cirkulรคrt beroende i kod.
Om instรคllningarna รคr falska kanske vi inte behรถver anvรคnda myExpensiveValue, vilket kan leda till att vi rรคddar oss frรฅn att gรถra en dyr berรคkning som hjรคlper till att sรคkerstรคlla att anvรคndarna har trevligt med vรฅr applikation eftersom vรฅra andra behov kan berรคknas korrekt utan att รถvervรคldigande ramen.
Om instรคllningarna รคr falska kanske vi inte behรถver anvรคnda myExpensiveValue, vilket kan leda till att vi rรคddar oss frรฅn att gรถra en dyr berรคkning som hjรคlper till att sรคkerstรคlla att anvรคndarna har en trevlig tid nรคr de anvรคnder vรฅr applikation eftersom vรฅra andra behov kan berรคknas pรฅ lรคmpligt sรคtt utan รถvervรคldigande ramen.
Latigheten hjรคlper ocksรฅ till med funktionsargument, dรคr argumenten bara anvรคnds nรคr de refereras inuti funktionen. Detta koncept kallas Call-by-name-parametrar.
def sometimesUsedString(someValue:String, defaultValue:=> String)={
if(someValue != null){
use(defaultValue)
}else{
use(someValue)
}
}
Mรฅnga sprรฅk anvรคnder call-by-value-sรคttet fรถr att utvรคrdera argument. Parametern som skickas genom call-by-name kommer bara att utvรคrderas nรคr det behรถvs i funktionskroppen och kommer inte att utvรคrderas innan dess. Nรคr vรคrdet vรคl har utvรคrderats lagras det och kan รฅteranvรคndas senare utan att det behรถver omvรคrderas. Ett koncept som รคr kรคnt som memoization.
Skriv inferens
I Scala behรถver du inte deklarera typer fรถr varje variabel du skapar. Detta beror pรฅ att Scala-kompilatorn kan gรถra typinferens pรฅ typer baserat pรฅ utvรคrdering av den hรถgra sidan. Detta gรถr att din kod kan vara mer kortfattad โ det befriar oss frรฅn att skriva beskrivningar dรคr den fรถrvรคntade typen รคr uppenbar
var first:String = "Hello, " var second:String = "World" var third = first + second //the compile infers that third is of type String
Hรถgre ordningsfunktion
En hรถgre ordningsfunktion รคr en funktion som kan ta funktioner som argument och kan returnera en funktion som en returtyp. I Scala betraktas funktioner som fรถrstklassiga medborgare. Genom att anvรคnda dessa funktioner pรฅ detta sรคtt kan vi vara mycket flexibla i vilken typ av program vi kan gรถra. Vi kan skapa funktioner dynamiskt och mata in funktionalitet dynamiskt till andra funktioner.
def doMathToInt(n:Int, myMathFunction:Int=>Int): Int ={
myMathFunction(n)
}
I ovanstรฅende funktion skickar vi in โโen int och en funktion som tar en int och returnerar en int. Vi kan skicka in vilken funktion som helst av den signaturen. Med signatur menar vi en funktions input och output. En signatur av Int=>Int betyder att en funktion tar en Int som indata och returnerar en Int som dess utdata.
En signatur av ()=>Int betyder att en funktion inte tar nรฅgonting som den รคr indata och returnerar en Int som dess utdata. Ett exempel pรฅ en sรฅdan funktion skulle vara en som genererar en slumpmรคssig int fรถr oss.
def generateRandomInt()={
return scala.util.Random.nextInt()
}
Ovanstรฅende funktion har en signatur ()=>Int
Vi kan ha en funktion som har en signatur scala ()=>Enhet. Detta innebรคr att funktionerna inte tar in nรฅgot och inte returnerar en typ. Funktionen kan vara att gรถra nรฅgon form av berรคkning genom att รคndra nรฅgot till att gรถra nรฅgot fรถrutbestรคmt.
Den hรคr typen av metoder uppmuntras dock inte, eftersom de verkar vara en svart lรฅda som kan pรฅverka ett system pรฅ okรคnda sรคtt. De รคr ocksรฅ otestbara. Genom att ha explicita in- och utdatatyper kan vi resonera om vad vรฅr funktion gรถr.
En hรถgre ordningsfunktion kan ocksรฅ returnera en funktion.
Till exempel kan vi skapa en metod som skapar en kraftfunktion, dvs tar ett nummer och applicerar kraft till det.
def powerByFunction(n:Int):Int=>Int = {
return (x:Int)=> scala.math.pow(x,n).toInt
}
Ovanstรฅende funktion tar en int. Vรฅr returtyp รคr en anonym funktion som tar en Int x, * vi anvรคnder int x som argument fรถr potensfunktionen.
Curry
I Scala kan vi konvertera en funktion som tar tvรฅ argument till en som tar ett argument i taget. Nรคr vi skickar in ett argument tillรคmpar vi det delvis och slutar med en funktion som tar ett argument fรถr att slutfรถra funktionen. Currying gรถr det mรถjligt fรถr oss att skapa funktioner genom att delvis lรคgga till nรฅgra argument.
Detta kan vara anvรคndbart fรถr att skapa funktioner dynamiskt innan vi har en komplett uppsรคttning argument
def multiply two numbers(n:Int)(m:Int): Unit ={
return n * m
}
Om vi โโbehรถver skapa en funktion som multiplicerar med nรฅgot specifikt tal, behรถver vi inte skapa en annan multiplikationsmetod.
Vi kan helt enkelt anropa .curried pรฅ vรฅr funktion ovan och fรฅ en funktion som tar ett argument fรถrst och returnerar en delvis tillรคmpad funktion
def multiplyTwoNumbers(n:Int)(m:Int): Unit ={
return n * m
}
var multiplyByFive = multiplyTwoNumbers(5)
multiplyByFive(4)
//returns 20
Mรถnstermatchning
Scala har en kraftfull inbyggd mekanism fรถr att hjรคlpa oss att kontrollera om en variabel matchar vissa kriterier, ungefรคr som vi skulle gรถra i en switch-sats i Java eller i en serie om/annat-pรฅstรฅenden. Sprรฅket har mรถnstermatchning som vi kan anvรคnda fรถr att kontrollera om en variabel รคr av en viss typ. Mรถnstermatchning i Scala รคr kraftfull och kan anvรคndas fรถr att destrukturera komponenterna som har en otillรคmplig metod fรถr att fรฅ fรคlt vi รคr intresserade av direkt frรฅn variabeln vi matchar.
Scalas mรถnstermatchning ger ocksรฅ en trevligare syntax jรคmfรถrt 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 jรคmfรถr vรฅr variabel med en uppsรคttning alternativ, och nรคr variabeln vi matchar uppfyller kriterierna, utvรคrderas uttrycket pรฅ hรถger sida av fettpilen (=>) och returneras som resultatet av matchningen.
Vi anvรคnder ett understreck fรถr att fรฅnga upp fall som รคr oรถvertrรคffade i vรฅr kod. Det speglar beteendet hos standardfallet nรคr man hanterar switch-satser.
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 ovan kan du ta reda pรฅ typen av myItem-variabeln och baserat pรฅ den fรถrgrena dig till nรฅgon specifik kod.
Mรถnstermatchning kontrollerar om variabeln matchar
Understrecket fungerar som en platshรฅllare som matchar alla andra villkor som inte matchas av de andra punkterna i fallbeskrivningarna ovan. Vi tar en variabel myItem och anropar matchningsmetoden.
- vi kontrollerar om myItem รคr sant med och gรถr lite logik pรฅ hรถger sida av den feta pilen "=>."
- vi anvรคnder understrecket fรถr att matcha allt som inte stรคmmer รถverens med nรฅgon av de fallsatser vi har definierat i koden.
Med Case-klasser kan vi till och med gรฅ lรคngre och destrukturera klassen fรถr att fรฅ fรคlt inuti objektet.
Genom att anvรคnda det fรถrseglade nyckelordet fรถr att definiera vรฅra klasser fรฅr vi fรถrdelen av att kompilatorn kontrollerar de fall vi fรถrsรถker matcha mot och varnar oss om vi glรถmmer att hantera en viss.
Ofรถrรคnderlighet
Det รคr mรถjligt att skapa vรคrden som inte kan รคndras av andra funktioner i Scala med hjรคlp av nyckelordet val. Detta uppnรฅs i Java genom att anvรคnda det sista nyckelordet. I Scala gรถr vi det genom att anvรคnda ett val nyckelord nรคr vi skapar en variabel istรคllet fรถr att anvรคnda var, vilket รคr alternativet vi skulle anvรคnda fรถr att skapa en fรถrรคnderlig variabel.
En variabel som definieras med nyckelordet val รคr skrivskyddad, medan en som definieras med var kan lรคsas och รคndras av andra funktioner eller godtyckligt av anvรคndaren 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
Att fรถrsรถka tilldela ett vรคrde till myNumber efter att vi har deklarerat det som ett val ger ett kompileringsfel eller "omtilldelning till val."
Varfรถr anvรคnda Immutability?
Immutability hjรคlper oss att fรถrhindra kod och andra programmerare frรฅn att รคndra vรฅra vรคrden ovรคntat, vilket skulle leda till ovรคntade resultat om de รคr avsedda att anvรคnda vรคrdet vi lagrar kan de istรคllet gรถra en kopia av det. Pรฅ sรฅ sรคtt fรถrhindras buggar som kan orsakas av att flera aktรถrer รคndrar samma variabel.
Klasser och objekt
Vi vet alla att objekt รคr de verkliga enheterna, och klass รคr en mall som definierar objekt. Klasser har bรฅde tillstรฅnd och beteenden. Tillstรฅnden รคr antingen vรคrden eller variabler. Beteenden รคr metoderna i Scala.
Lรฅt oss titta pรฅ hur du kan definiera en klass, instansiera den och anvรคnda den med Scala.
Hรคr kallas klassen Rectangle, som har tvรฅ variabler och tvรฅ funktioner. Du kan ocksรฅ anvรคnda parametrarna l och b direkt som fรคlt i programmet. Du har ett objekt som har en huvudmetod och har instansierat klassen med tvรฅ vรคrden.
Exempelvis:
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)
}
}
Alla fรคlt och metoder รคr som standard offentliga i Scala. Det รคr viktigt att anvรคnda override eftersom toString-metoden รคr definierad fรถr Object i Scala.
Arv
Scala har flera typer av arv (som singel, multi-level, multipel, hierarkisk, hybrid) som har mycket gemensamt med traditionella former som finns i Java. Du kan รคrva bรฅde frรฅn klasser och egenskaper. Du kan รคrva medlemmarna i en klass till en annan klass med nyckelordet "extends". Detta mรถjliggรถr รฅteranvรคndning.
Det รคr mรถjligt att รคrva frรฅn en klass eller flera klasser. Det รคr ocksรฅ mรถjligt att รคrva frรฅn underklasser som sjรคlva har sina superklasser, vilket skapar en hierarki av arv i processen.
I nedanstรฅende Scala-exempel รคr Base-klassen Circle och den hรคrledda klassen Sphere. En cirkel har ett vรคrde som kallas radie, som รคrvs i klassen Sphere. Metoden calcArea รฅsidosรคtts med hjรคlp av nyckelordet รฅsidosรคttande.
Exempelvis:
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 skapa abstrakta metoder och medlemsfรคlt med hjรคlp av abstrakta klasser och egenskaper. Inuti abstrakta klasser och egenskaper kan vi definiera abstrakta fรคlt utan att nรถdvรคndigtvis implementera dem.
Exempelvis:
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"
}
}
Dessa fรคlt implementeras av klasserna som utรถkar egenskapen eller den abstrakta klassen. Du kan anvรคnda egenskaper fรถr att skapa kontrakt om vad vรฅr applikation ska kunna gรถra och sedan implementera dessa metoder senare.
trait DatabaseService{
def addItemName(itemName:String)
def removeItem(itemId:Int)
def updateItem(itemId:Int, newItemName:String)
}
Pรฅ sรฅ sรคtt kan vi planera hur vรฅr applikation kommer att se ut utan att implementera de metoder som kan hjรคlpa oss att fรถrestรคlla oss hur olika metoder kommer att se ut. Det fรถljer ett mรถnster som kallas programmering till abstraktioner och inte sjรคlva implementeringen.
Klassen som inleds med nyckelordet abstrakt kan innehรฅlla bรฅde abstrakta och icke-abstrakta metoder. Men flera arv stรถds inte i abstrakt klass. Sรฅ du kan utรถka hรถgst en abstrakt klass.
Singleton objekt
En Singleton รคr en klass som bara instansieras en gรฅng i ett program. Det kommer frรฅn ett populรคrt och anvรคndbart programmeringsmรถnster som kallas "singleton-mรถnstret". Det รคr anvรคndbart fรถr att skapa instanser som รคr avsedda att vara lรฅnglivade och kommer att vara allmรคnt tillgรคngliga i hela ditt program vars tillstรฅnd รคr integrerad i koordineringen av hรคndelserna i ett system. Att skapa en sรฅdan klass i Scala รคr enkelt eftersom Scala ger oss ett enkelt sรคtt att skapa singletons med hjรคlp av objektnyckelordet.
object UserProfile{
var userName=""
var isLoggedIn:Boolean = false
}
Vi kan sedan referera till detta objekt genom hela vรฅrt program med garantin att alla delar av vรฅrt program kommer att se samma data eftersom det bara finns en instans av det.
def getLoggedInStatus():Boolean={
return UserProfile.isLoggedIn
}
def changeLoggedInStatus():Boolean={
UserProfile.isLoggedIn = !UserProfile.isLoggedIn
return UserProfile.isLoggedIn
}
Konceptet med statiska medlemmar finns inte i Scala, det รคr anledningen till att du behรถver anvรคnda singleton-objekt, som fungerar som statiska medlemmar i en klass.
Implicita klasser
Implicita klasser รคr den nya funktionaliteten som lagts till efter version 2.1. Det รคr frรคmst fรถr att lรคgga till ny funktionalitet till de slutna klasserna.
Det implicita nyckelordet bรถr definieras i en klass, objekt eller egenskap. Den primรคra konstruktorn fรถr en implicit klass bรถr ha exakt ett argument i sin fรถrsta parameterlista. Den kan ocksรฅ innehรฅlla en ytterligare implicit parameterlista.
I nedanstรฅende Scala-exempel lรคggs ny funktionalitet till fรถr att ersรคtta vokaler i en strรคng med *.
object StringUtil {
implicit class StringEnhancer(str: String) {
def replaceVowelWithStar: String = str.replaceAll("[aeiou]", "*")
}
}
Du mรฅste importera i klassen dรคr du anvรคnder den.
import StringUtil.StringEnhancer
object ImplicitEx extends App {
val msg = "This is Guru99!"
println(msg.replaceVowelWithStar)
}
Objektorienterad programmering (OOP) kontra funktionell programmering (FP)
I OOP konstrueras program genom att gruppera data och de funktioner som fungerar pรฅ dessa data i hรถgt sammankopplade enheter. Objekt bรคr sina data i de fรคlt och metoder som verkar pรฅ dem. I denna programmeringsstil รคr den huvudsakliga abstraktionen data eftersom metoderna som skapas รคr avsedda att arbeta pรฅ data.
Funktionell programmering, รฅ andra sidan, separerar data och de funktioner som verkar pรฅ datan. Detta gรถr det mรถjligt fรถr utvecklare att behandla funktioner som abstraktionen och drivkraften vid modellering av program.
Scala mรถjliggรถr funktionell programmering genom att ha funktioner som fรถrstklassiga medborgare, vilket gรถr att de kan รถverfรถras som vรคrden till andra funktioner och รคven returneras som vรคrden. Kombinationen av dessa tvรฅ paradigm har gjort Scala till ett utmรคrkt val fรถr att bygga komplex mjukvara i olika branscher, sรฅsom Data Science.
Viktiga ramverk pรฅ Scala
Hรคr รคr nรฅgra viktiga ramverk fรถr Scala
- Spela รคr ett ramverk fรถr webbapplikationer med รถppen kรคllkod som anvรคnder MVC-arkitektur. Slรคppt 2007 och nu licensierad under Apache, Det blev det mest populรคra ramverket pรฅ GitHub 2013. Fรถretag som LinkedIn, Walmart, Samsung, Eero anvรคnder detta ramverk.
- Hiss รคr ett annat gratis webbramverk skrivet i Scala som lanserades 2007. Foursquare anvรคnder Lift-ramverket. Det รคr hรถgpresterande, snabbare att bygga ramverk.
- Som
- Katter - Leecork
- Spark
Samtidighetsstรถd
- Vรคrdena i Scala รคr som standard ofรถrรคnderliga. Detta gรถr den mycket anpassningsbar till den samtidiga miljรถn.
- Det finns mรฅnga funktioner i Scala som gรถr den bรคst fรถr samtidiga applikationer.
- Futures and Promises gรถr det lรคttare att bearbeta data asynkront, vilket stรถdjer parallellism.
- Akka โ verktygslรฅda som anvรคnder Actors samtidighetsmodell. Det finns ett antal skรฅdespelare som agerar nรคr de fรฅr meddelanden.
- Samtidighet med hjรคlp av trรฅdar frรฅn Java kan รคven stรถdjas i Scala.
- Strรถmbehandling รคr en annan bra funktion som mรถjliggรถr kontinuerlig realtidsbearbetning av data.
Scala har nรฅgra av de bรคsta samtidighetsbiblioteken i Java ekosystem.
- Native Java trรฅdar
- Fibrer frรฅn bibliotek som Vertex
- ZIO โ ett bibliotek som har primitiver fรถr att hjรคlpa oss att hantera samtidighet och asynkron berรคkning
- STM โ Transaktion
- Framtid โ inbyggd i Scala-sprรฅket
Java mot Scala
Hรคr รคr de viktigaste Skillnaden mellan Java och Scala.
| Skala | Java |
|---|---|
| Mer kompakt och koncis | Jรคmfรถrelsevis stรถrre kodbitar |
| Designad och utvecklad fรถr att vara bรฅde objekt- och funktionsorienterat sprรฅk. Stรถder ett brett utbud av funktionella programmeringsfunktioner som samtidighet, ofรถrรคnderlighet. |
Ursprungligen utvecklat som ett objektorienterat sprรฅk och bรถrjade stรถdja funktionella programmeringsfunktioner under de senaste dagarna. Fortfarande รคr inte starkt som ett funktionellt programmeringssprรฅk. |
| Anvรคnder aktรถrsmodell fรถr att stรถdja samtidighet som รคr modernt | Anvรคnder den konventionella trรฅdbaserade modellen fรถr samtidighet. |
| Stรถder ramverk โ Lek, Lyft | Stรถder fjรคder, graler, mycket mer |
| Stรถder lat utvรคrdering | Stรถder inte lat utvรคrdering |
| Inga statiska medlemmar | Innehรฅller statiska medlemmar |
| Stรถder operatรถrens รถverbelastning | Stรถder inte รถverbelastning av operatรถren |
| Sammanstรคllningen av kรคllkoden gรฅr relativt lรฅngsamt | Sammanstรคllning av kรคllkod รคr snabbare รคn Scala |
| Egenskaper โ agera som Java 8 grรคnssnitt | Java 8 grรคnssnitt fรถrsรถker รถverbrygga klyftan mellan klasser och grรคnssnitt |
| Omskrivning behรถvs | Omskrivning krรคvs inte |
| Ingen garanti om de buggfria koderna | Fullstรคndig fรถrsรคkran om mindre defekter |
| Stรถder bakรฅtkompatibilitet. | Scala stรถder inte bakรฅtkompatibilitet. |
| Operators behandlas olika i Java och รคr inte metodanrop. | Alla operatรถrer pรฅ poster sker via en metod som kallas i Scala. |
| Stรถder flera arv med klasser men inte av abstrakta klasser | Stรถder inte flera arv med klasser, utan genom grรคnssnitt |
| Koden รคr skriven i en kompakt form. | Koden รคr skriven i lรฅng form. |
| Scala innehรฅller inte det statiska nyckelordet. | Java innehรฅller det statiska nyckelordet. |
Sammanfattning
I den hรคr handledningen har du lรคrt dig hur du kommer igรฅng med Scala. Du har ocksรฅ lรคrt dig de funktionella och objektorienterade funktionerna. Du har ocksรฅ upptรคckt likheterna och skillnaderna mellan Java och Scala. Denna handledning borde ha hjรคlpt dig med en mรคngd olika exempel som รคr vรคl demonstrerade.






















