Scala handledning

โšก Smart sammanfattning

Scala Tutorial introducerar ett statiskt typat, JVM-baserat sprรฅk som fรถrenar objektorienterad och funktionell programmering. Guiden tรคcker installation, syntax, kรคrnfunktioner och ramverk som gรถr Scala idealiskt fรถr att bygga samtidiga, skalbara och koncisa moderna applikationer.

  • ๐Ÿ”˜ Hybridparadigm: Scala kombinerar objektorienterad och funktionell programmering pรฅ JVM, vilket gรถr det mรถjligt fรถr utvecklare att kombinera ofรถrรคnderlighet, fรถrstklassiga funktioner och traditionella klasshierarkier.
  • โ˜‘๏ธ Kortfattad syntax: Typinferens, anonyma funktioner och mรถnstermatchning minskar standardinstรคllningarna jรคmfรถrt med Java medan keeping koden รคr uttrycksfull och lรคsbar.
  • โœ… Installation med IntelliJ: Installera Community Edition IDE, lรคgg till Scala-pluginet och skapa ett objekt som utรถkar appen fรถr att kรถra det fรถrsta Hello World-programmet.
  • ๐Ÿงช Funktionella byggstenar: Lat utvรคrdering, currying, funktioner av hรถgre ordning och ofรถrรคnderlighet genom val som stรถder ren och fรถrutsรคgbar kod.
  • ๐Ÿ› ๏ธ Samtidighet och ramverk: Akka-skรฅdespelare, Futures, Play, Lift och Spark gรถr Scala till ett starkt val fรถr distribuerade system, webbapplikationer och datateknik.

Scala handledning

Vad รคr Scala?

Skala รคr ett statiskt typat programmeringssprรฅk som kombinerar objektorienterad och funktionell programmering fรถr att fรถrbรคttra skalbarheten hos applikationer. Scala kรถrs huvudsakligen pรฅ JVM-plattformen, och utvecklare kan ocksรฅ anvรคnda det fรถr att skriva programvara fรถr native plattformar via Scala-Native, eller fรถr webblรคsaren via ScalaJs och JavaScript kรถrning.

Scala รคr ett skalbart sprรฅk som anvรคnds fรถr att bygga programvara fรถr flera plattformar, vilket รคr precis sรฅ det fick sitt namn. Sprรฅket utformades fรถr att lรถsa flera av de utdragsproblem som finns i Java samtidigt som den fรถrblev koncis. Martin Odersky designade Scala, och den fรถrsta offentliga utgรฅvan kom ut 2004.

Varfรถr lรคra sig Scala

Hรคr รคr de frรคmsta anledningarna till att lรคra sig programmeringssprรฅket Scala:

  • Scala รคr lรคtt att lรคra sig fรถr objektorienterade programmerare och Java utvecklare, och det har blivit 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.
  • Det รคr utformat fรถr applikationer som รคr samtidiga, distribuerade och robusta meddelandedrivna, vilket gรถr det till ett av de mest efterfrรฅgade sprรฅken under detta decennium.
  • Det รคr ett koncist, kraftfullt sprรฅk som snabbt kan vรคxa i takt med anvรคndarnas behov.
  • Den รคr objektorienterad och innehรฅller mรฅnga funktionella programmeringsfunktioner, vilket ger utvecklare stor flexibilitet i hur de skriver kod.
  • Scala erbjuder Duck Typing genom strukturella typer.
  • Den har mindre standard รคn Java.
  • Ramverken Lift and Play, som รคr skrivna i Scala, fortsรคtter att mogna och vรคxa i popularitet.

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, besรถk den officiella webbplatsen pรฅ https://www.scala-lang.org/download/ fรถr att ladda ner den senaste versionen av Scala.

Efter lรคnken visas tvรฅ alternativ fรถr att installera Scala. I den hรคr Scala-handledningen kommer vi att anvรคnda IntelliJ IDEA, vilket ger utmรคrkt Scala-stรถd direkt ur lรฅdan.

Hur man installerar Scala

Nรคr du besรถker nedladdningslรคnken hittar du tvรฅ utgรฅvor av IntelliJ IDE.

Fรถr den hรคr Scala-handledningen kommer vi att ladda ner Community Edition, som รคr gratis och innehรฅller allt du behรถver fรถr att skriva Scala-program.

Nedladdningssida fรถr IntelliJ Community Edition

Steg 1) Vรคlj Community-utgรฅva.
Klicka pรฅ rullgardinsmenyn Community Edition pรฅ sidan.

Den presenterar ett alternativ att ladda ner IntelliJ IDE tillsammans med JBR, som innehรฅller en JDK-implementering (Java Development Kit) som OpenJDK som Scala behรถver fรถr att kompilera och kรถra kod.

Ladda ner IntelliJ med JBR

Steg 2) Kรถr installationen.
Nรคr du har laddat ner IntelliJ dubbelklickar du pรฅ installationsprogrammet och fรถljer guiden pรฅ skรคrmen.

IntelliJ installationsguide

Steg 3) Vรคlj en plats.
Vรคlj en plats fรถr att installera IDE.

Vรคlj installationsmapp

Om du inte laddade ner paketet med JDK uppmanas du fortfarande att lรคgga till JDK via en kryssruta under installationen.

JDK-kryssrutan under installationen

Steg 4) Klicka pรฅ Nรคsta.
Lรคmna de andra standardinstรคllningarna som de รคr och klicka pรฅ Nรคsta.

Standardinstรคllningar fรถr installationsprogrammet

Scala Hello World-programmet

Steg 5) Klicka pรฅ startikonen.
Nรคr installationen รคr klar kรถr du IntelliJ IDE genom att klicka pรฅ startikonen i Start-menyn som ett vanligt program.

IntelliJ vรคlkomstskรคrm

Du behรถver fortfarande lรคgga till Scala-pluginet i IntelliJ. Klicka pรฅ rullgardinsmenyn i konfigurationsmenyn lรคngst ner till hรถger pรฅ skรคrmen och vรคlj alternativet Plugins.

Konfigurera meny fรถr plugin-program

IntelliJ-pluginmarknaden

Pรฅ fliken Marketplace sรถker du efter Scala. Plugin-programmet visas som det fรถrsta resultatet under taggen Sprรฅk.

Steg 6) Installera plugin.
Klicka pรฅ Installera fรถr att bรถrja ladda ner Scala-pluginet.

Installera Scala-pluginet

Steg 7) Starta om IDE:n.
Nรคr nedladdningen รคr klar uppmanas du att starta om IDE:n sรฅ att det installerade plugin-programmet kan bรถrja fungera.

Starta om IntelliJ-prompten

Efter omstart รฅtergรฅr du till samma sida som tidigare, men nu รคr Scala-pluginet installerat och klart.

Steg 8) Vรคlj Skapa projekt, vilket leder till en sida dรคr du kan vรคlja sprรฅk fรถr projektet.

Skapa nytt projekt i IntelliJ

Steg 9) Vรคlj Scala genom att markera kryssrutan Scala och klicka pรฅ Nรคsta.

Vรคlj Scala-sprรฅk

Steg 10) Vรคlj en plats att spara projektfilen och ge projektet ett namn.

Namnge och lokalisera projektet

Om katalogen inte finns, frรฅgar IntelliJ om tillรฅtelse att skapa mappen. Godkรคnn och klicka pรฅ Slutfรถr. Du kommer dรฅ till ditt Scala-projekt, som fรถr nรคrvarande inte innehรฅller nรฅgon Scala-kod.

Det tar lite tid att ladda index, sรฅ oroa dig inte om du inte kan interagera med IDE:n medan en fรถrloppsindikator visas lรคngst ner. IDE:n laddar de filer som krรคvs fรถr att kรถra Scala och tillhandahรฅlla autokomplettering.

Steg 11) Klicka pรฅ fliken Projekt till vรคnster om IDE:n och expandera den fรถr att se projektets innehรฅll.

Expandera projektfliken

Vid det hรคr laget รคr projektet tomt och innehรฅller endast en .idea-mapp och en hello-world.iml-fil som genereras av IDE:n. Det intressanta รคr src-mappen, som innehรฅller kรคllkoden fรถr projektet. Det รคr hรคr du skapar din fรถrsta Scala-fil.

Steg 12) Hรถgerklicka pรฅ src fรถr att รถppna en meny och skapa en ny Scala-fil.

Skapa en ny Scala-fil

Vรคlj ett namn fรถr filen. Fรถr den hรคr Scala-handledningen, anvรคnd hallรฅoch vรคlj sedan Objekt frรฅn rullgardinsmenyn fรถr innehรฅllstypen fรถr Scala-filen.

Vรคlj objekttyp

Nรคr du har gjort detta har du en Scala-fil som innehรฅller ett singleton-objekt som du kommer att anvรคnda fรถr att kรถra koden.

Singleton-objekt skapat

Nu nรคr du har en Scala-fil med ett Hello-objekt, skriv ditt fรถrsta program genom att utรถka objektet du skapade med hjรคlp av nyckelordet App.

Att utรถka objektet med App anger vilken kod som ska kรถras nรคr programmet startar. Omedelbart efter att App har utรถkats visas en grรถn pil pรฅ vรคnster sida, vilket indikerar att programmet nu รคr kรถrbart.

Kรถr pilen i IntelliJ

Kรถr Hello-alternativet

Inuti Hello-objektet skriver du funktionen println() fรถr att skriva ut texten till konsolen. Kรถr programmet genom att klicka pรฅ den grรถna pilen.

Om du klickar pรฅ pilen visas alternativet Kรถr Hello. Om du vรคljer det kompileras koden, och efter nรฅgra sekunder visas programmets utdata i IntelliJ-konsolen.

Hej vรคrlden-utdata i konsolen

Du har nu installerat Scala och kรถrt ditt fรถrsta program.

Vad du kan gรถra med Scala

Scala anvรคnds flitigt inom mรฅnga omrรฅden pรฅ grund av dess flexibilitet och JVM-interoperabilitet. Vanliga anvรคndningsomrรฅden inkluderar:

  • Frontend-webbutveckling med ScalaJS.
  • Mobil utveckling fรถr Android och iOS med Scala Native.
  • Serversidesbibliotek som HTTP4S, Akka-Http och Play Framework.
  • Sakernas internet (IoT)-applikationer.
  • Spelutveckling.
  • Naturlig sprรฅkbehandling med hjรคlp av ScalaNLP-bibliotekssviten.
  • Att รถva avancerade tekniker som funktionell programmering och objektorienterad programmering tillsammans.
  • Mycket samtidiga kommunikationsapplikationer med aktรถrer, ett bibliotek fรถr JVM inspirerat av Erlang.
  • Maskininlรคrning med bibliotek som Figaro fรถr probabilistisk programmering och Apache Spark fรถr storskalig databehandling.

Anonyma funktioner

Scala-sprรฅket stรถder anonyma funktioner, รคven kallade funktionsliteralEftersom Scala รคr ett funktionellt sprรฅk bryter utvecklare ofta upp stora problem i mรฅnga smรฅ uppgifter och skapar mรฅnga funktioner. Fรถr att gรถra detta enkelt tillรฅter Scala att funktioner instansierat utan namnDu kan tilldela dem direkt till variabler eller till definitioner med hjรคlp av def, som visas i fรถljande Scala-exempel:

val multiplyByTwo = (n:Int) => n * 2
def multiplyByThree = (n:Int) => n * 3

Du kan sedan anvรคnda dem som vanliga funktioner genom att skicka parametrar:

multiplyByTwo(3)
//6

multiplyByThree(4)
//12

Dessa metoder รคr praktiska nรคr du vill ha ren och koncis kod. Anonyma funktioner รคr anvรคndbara nรคr du definierar metoder som รคr smรฅ och inte krรคver mycket kod i sin text. De รคr mycket enkla och krรคver ingen ceremoni fรถr att skapas.

Dessa metoder รคr inte begrรคnsade till funktioner med argument och kan anvรคndas fรถr att instansiera metoder som inte tar nรฅgra argument.

val sayHello = () => { println("hello") }

De flesta av dessa anonyma funktioner anvรคnds i andra delar av koden dรคr du behรถver en snabbfunktion pรฅ plats. Av denna anledning kallas de รคven fรถr inline-funktionerAtt anvรคnda anonyma funktioner รคr ett vanligt mรถnster som fรถrekommer i hela samlingsbiblioteket fรถr att utfรถra snabba รฅtgรคrder รถver en samling.

Till exempel anvรคnder filtermetoden en inline-funktion fรถr att skapa en annan samling med endast de element som uppfyller kriterierna som definieras 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 kontrollerar de anonyma funktionerna om vรคrdet frรฅn listan รคr udda eller jรคmnt och returnerar matchande element.

//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 den anonyma funktionsparametern inte รคr namngiven. Till exempel:

var timesTwo = (_:Int) * 2

timesTwo(5)
//10

I det hรคr scenariot namnger du inte parametern. Understreck anvรคnds fรถr att representera den.

Lat utvรคrdering

De flesta sprรฅk utvรคrderar variabler och funktionsparametrar sekventiellt, en efter en. I Scala รคr nyckelordet lazy hjรคlper till att hantera vรคrden som du inte vill utvรคrdera fรถrrรคn de refereras.

En variabel markerad som lazy utvรคrderas inte dรคr den definieras, vilket allmรคnt kallas eager evaluation. Den utvรคrderas bara nรคr den refereras senare i koden.

Detta kan vara anvรคndbart nรคr utvรคrderingen av ett vรคrde skulle vara en dyr berรคkning. Om vรคrdet inte alltid behรถvs, slipper du en dyr berรคkning som kan gรถra programvaran lรฅngsammare genom att gรถra variabeln 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 cirkulรคra beroenden i kod.

Om instรคllningsflaggan รคr falsk behรถver du inte anvรคnda myExpensiveValue, vilket sparar dig frรฅn att gรถra en dyr berรคkning. Detta bidrar till att sรคkerstรคlla att anvรคndarna fรฅr en smidig upplevelse eftersom resurser inte slรถsas bort pรฅ vรคrden som aldrig lรคses.

Lathet hjรคlper ocksรฅ 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-metoden fรถr att utvรคrdera argument. En parameter som skickas via call-by-name utvรคrderas endast nรคr det behรถvs inuti funktionens innehรฅll. Nรคr vรคrdet har utvรคrderats lagras det och kan รฅteranvรคndas senare utan omvรคrdering, ett koncept som kallas memoization.

Skriv inferens

I Scala behรถver du inte deklarera typer fรถr varje variabel du skapar eftersom Scala-kompilatorn kan hรคrleda typer frรฅn hรถger sida av ett uttryck. Detta gรถr att din kod blir mer koncis och du slipper skriva standardtexter dรคr den fรถrvรคntade typen รคr uppenbar.

var first:String = "Hello, "
var second:String = "World"
var third = first + second
//the compiler infers that third is of type String

Funktion av hรถgre ordning

En funktion av hรถgre ordning รคr en funktion som kan ta funktioner som argument och returnera en funktion som en returtyp. I Scala betraktas funktioner som fรถrstklassiga medborgare. Genom att anvรคnda funktioner pรฅ det hรคr sรคttet kan du vara mycket flexibel i vilka typer av program du kan bygga. Du kan skapa funktioner dynamiskt och dynamiskt mata funktionalitet till andra funktioner.

def doMathToInt(n:Int, myMathFunction:Int=>Int): Int = {
    myMathFunction(n)
}

I funktionen ovan skickar du in en Int och en funktion som tar en Int och returnerar en IntDu kan skicka in vilken funktion som helst av den signaturen. Med signatur menar vi en funktions indata och utdata. En signatur av Int => Int betyder att en funktion tar ett heltal som indata och returnerar ett heltal som utdata.

En signatur av () => Int betyder att en funktion inte tar nรฅgonting som indata och returnerar ett heltal som utdata. Ett exempel pรฅ en sรฅdan funktion รคr en som genererar ett slumpmรคssigt heltal.

def generateRandomInt() = {
 return scala.util.Random.nextInt()
}

Funktionen ovan har en signatur () => Int.

En funktion kan ocksรฅ ha en signatur () => UnitDet betyder att funktionen inte tar in nรฅgot och inte returnerar nรฅgon typ. Funktionen kan istรคllet รคndra tillstรฅnd eller utfรถra en fรถrutbestรคmd รฅtgรคrd.

Den hรคr typen av metoder uppmuntras inte eftersom de kan fungera som en svart lรฅda som pรฅverkar ett system pรฅ okรคnda sรคtt. De รคr ocksรฅ svรฅrare att testa. Att ha explicita in- och utdatatyper gรถr att du kan resonera kring vad din funktion gรถr.

En funktion av hรถgre ordning kan ocksรฅ returnera en funktion. Du kan till exempel skapa en metod som returnerar en potensfunktion, en funktion som tar ett tal och tillรคmpar en potens pรฅ det.

def powerByFunction(n:Int): Int=>Int = {
  return (x:Int) => scala.math.pow(x,n).toInt
}

Funktionen ovan tar ett heltal. Dess returtyp รคr en anonym funktion som tar ett heltal. x och anvรคnder det som argument fรถr potensfunktionen.

Curry

I Scala kan du konvertera en funktion som tar tvรฅ argument till en som tar ett argument i taget. Nรคr du skickar in ett argument tillรคmpar du det delvis och fรฅr en funktion som tar det รฅterstรฅende argumentet fรถr att slutfรถra anropet. Med Currying kan du bygga funktioner genom att delvis lรคgga till nรฅgra argument.

Detta รคr anvรคndbart fรถr att skapa funktioner dynamiskt innan du har en komplett uppsรคttning argument.

def multiplyTwoNumbers(n:Int)(m:Int): Int = {
  return n * m
}

Om du behรถver en funktion som multiplicerar med ett specifikt tal behรถver du inte skapa en annan multiplikationsmetod. Du kan tillรคmpa ett argument pรฅ den kurerade funktionen och รฅteranvรคnda resultatet:

def multiplyTwoNumbers(n:Int)(m:Int): Int = {
  return n * m
}

var multiplyByFive = multiplyTwoNumbers(5) _

multiplyByFive(4)

//returns 20

Mรถnstermatchning

Scala har en kraftfull inbyggd mekanism som hjรคlper dig att kontrollera om en variabel uppfyller vissa kriterier, ungefรคr som en switch-sats i Java eller en kedja av if/else-satser. Sprรฅket stรถder mรถnstermatchning, vilket du kan anvรคnda fรถr att kontrollera om en variabel รคr av en viss typ. Mรถnstermatchning i Scala รคr kraftfull och kan fรถrstรถra komponenter som har en unapply metod fรถr att hรคmta de fรคlt du รคr intresserad av direkt frรฅn variabeln som matchas.

Skalamรถnstermatchning ger ocksรฅ en mer behaglig syntax รคn en switch-sats.

myItem match {
  case true => //do something
  case false => //do something else
  case  _ => //if none of the above do this by default
}

Du jรคmfรถr variabeln med en uppsรคttning alternativ. Nรคr variabeln uppfyller kriterierna utvรคrderas uttrycket till hรถger om den feta pilen (=>) och returneras som resultatet av matchningen.

Understrecket fรฅngar upp fall som inte matchas i koden, vilket speglar beteendet hos standardfallet i en switch-sats.

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 _ => //unknown type, do something else
}

I koden ovan kan du identifiera typen av myItem variabel och, baserat pรฅ den, fรถrgrena sig till specifik kod.

Mรถnstermatchning kontrollerar om variabeln matchar varje fall i ordning.

Understrecket fungerar som en platsmarkรถr som matchar alla villkor som de andra fallsatserna inte matchar. Du tar en variabel myItem och ring match metod.

  • Kolla vรคdret myItem is true och kรถr logiken pรฅ hรถger sida om den feta pilen โ€œ=>โ€.
  • Anvรคnd understrecket fรถr att matcha allt som inte matchar nรฅgon av de case-satser som definieras i koden.

Med fallklasser kan du destrukturera klassen till exempeltract-fรคlt inuti objektet.

Med hjรคlp av sealed nyckelordet fรถr att definiera klasser fรฅr du fรถrdelen att kompilatorn noggrant kontrollerar de fall du fรถrsรถker matcha och varnar dig om du glรถmmer att hantera ett.

Ofรถrรคnderlighet

Det รคr mรถjligt att skapa vรคrden som inte kan รคndras av andra funktioner i Scala genom att anvรคnda val nyckelord. Detta uppnรฅs i Java genom att anvรคnda final nyckelord. I Scala anvรคnder du ett val nรคr man skapar en variabel istรคllet fรถr var, vilket รคr alternativet fรถr muterbara variabler.

En variabel definierad med hjรคlp av val nyckelordet รคr skrivskyddat, medan ett som definieras med var kan lรคsas och รคndras senare av andra funktioner eller av anvรคndaren i koden.

var changeableVariable = 8

changeableVariable = 10
//the compiler does not complain, and the code compiles successfully

println(changeableVariable)
//10

val myNumber = 7

myNumber = 4

//this will not compile

Fรถrsรถker tilldela ett vรคrde till myNumber efter att ha deklarerat det som en val utlรถser ett kompileringsfel: "omtilldelning till val."

Varfรถr anvรคnda Immutability?

Ofรถrรคnderlighet hjรคlper till att fรถrhindra att kod och andra programmerare รคndrar vรคrden ovรคntat, vilket skulle leda till ofรถrutsรคgbara resultat. Om konsumenter av ett vรคrde behรถver รคndra det kan de istรคllet gรถra en kopia. Pรฅ sรฅ sรคtt fรถrhindras buggar som orsakas av att flera aktรถrer รคndrar samma variabel.

Klasser och objekt

Objekt รคr verkliga enheter, och en klass รคr en mall som definierar objekt. Klasser har bรฅde tillstรฅnd och beteenden. Tillstรฅnden รคr antingen vรคrden eller variabler. Beteendena รคr metoderna i Scala.

Nรคsta avsnitt visar hur man definierar en klass, instansierar den och anvรคnder den i Scala.

Hรคr รคr en klass som heter Rektangel som har tvรฅ vรคrden 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 main-metod och instansierar klassen med tvรฅ vรคrden.

Exempel:

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 a rectangle with length $length and breadth $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 publika som standard i Scala. Det รคr viktigt att anvรคnda override dรคrfรถr att toString รคr redan definierad fรถr varje objekt i Scala.

Arv

Scala har flera typer av arv (enkel, flernivรฅ, multipel, hierarkisk och hybrid) som har mycket gemensamt med traditionella former som finns i JavaDu kan รคrva bรฅde frรฅn klasser och frรฅn egenskaper. Du รคrver medlemmarna i en klass till en annan klass med hjรคlp av nyckelordet extendsDetta 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 egna superklasser, vilket skapar en arvshierarki i processen.

I Scala-exemplet nedan รคr basklassen Circle, och den hรคrledda klassen รคr SphereEn cirkel har ett vรคrde som kallas radie, vilket รคrvs i Sphere-klassen. Metoden calcArea รฅsidosรคtts med hjรคlp av nyckelordet override.

Exempel:

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
    }
  }

Abstraction

I Scala kan du skapa magmusklertract-metoder och medlemsfรคlt med hjรคlp av abstract-klasser och egenskaper. Inre magmusklertract-klasser och egenskaper, du kan definiera magmusklertract-fรคlt utan att implementera dem.

Exempel:

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 de klasser som utรถkar egenskapen eller abstract-klassen. Du kan anvรคnda egenskaper fรถr att skapa nackdelartracts fรถr vad en applikation ska 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 du planera hur en applikation ska se ut utan att implementera metoderna, helping du fรถrestรคller dig hur olika metoder kommer att se ut. Det fรถljer ett mรถnster som kallas programmering till magmusklertractioner snarare รคn till det faktiska genomfรถrandet.

En klass inleddes med abstract sรถkordet kan innehรฅlla bรฅde magmusklertract och icke-abdoministract-metoder. Multipel arv stรถds dock inte i abstract-klasser, sรฅ att du bara kan strรคcka ut en magetract-klass.

Singleton objekt

En singleton รคr en klass som bara instansieras en gรฅng i ett program. Den kommer frรฅn ett populรคrt och anvรคndbart programmeringsmรถnster som kallas "singletonmรถnstret". Det รคr anvรคndbart fรถr att skapa instanser som รคr avsedda att vara lรฅnglivade och allmรคnt รฅtkomliga i hela programmet, dรคr tillstรฅndet รคr integrerat i att koordinera hรคndelser i ett system. Att skapa en sรฅdan klass i Scala รคr enkelt eftersom Scala tillhandahรฅller ett enkelt sรคtt att skapa singletons med hjรคlp av object nyckelord.

object UserProfile {
    var userName = ""
    var isLoggedIn:Boolean = false
}

Du kan sedan referera till detta objekt genom hela programmet med garantin att alla delar av programmet ser 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 existerar inte i Scala, vilket รคr anledningen till att man anvรคnder singleton-objekt som fungerar som statiska medlemmar i en klass.

Implicita klasser

Implicita klasser รคr en funktion som lades till i version 2.10 och anvรคnds frรคmst fรถr att lรคgga till ny funktionalitet till befintliga slutna klasser.

Ocuco-landskapet implicit Nyckelordet ska definieras i en klass, ett objekt eller en egenskap. Den primรคra konstruktorn fรถr en implicit klass mรฅste ha exakt ett argument i sin fรถrsta parameterlista. Den kan ocksรฅ inkludera en ytterligare implicit parameterlista.

I Scala-exemplet nedan har en ny funktionalitet lagts 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 den implicita klassen till den klass 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 av grupperping data och de funktioner som arbetar med dessa data till starkt sammankopplade enheter. Objekt bรคr sina data i fรคlt och metoderna arbetar med dem. I denna programmeringsstil รคr det huvudsakliga abstraction รคr data, eftersom metoderna som skapas รคr avsedda att fungera pรฅ data.

Funktionell programmeringseparerar รฅ andra sidan data och de funktioner som arbetar med dem. Detta gรถr det mรถjligt fรถr utvecklare att behandla funktioner som abstraction och drivkraft vid modellering av program.

Scala mรถjliggรถr funktionell programmering genom att behandla funktioner som fรถrstklassiga medborgare, vilket gรถr att de kan skickas 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 programvara inom branscher 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-arkitekturSlรคpptes 2007 och รคr nu licensierad under Apache, och blev ett av de mest populรคra ramverken pรฅ GitHub รฅr 2013. Fรถretag som LinkedIn, Walmart, Samsung och Eero anvรคnder detta ramverk.
  • Hiss รคr ett annat gratis webbramverk skrivet i Scala, lanserat 2007. Foursquare anvรคnder Lift-ramverket. Det รคr ett hรถgpresterande ramverk som รคr snabbt att bygga med.
  • Som tillhandahรฅller en verktygslรฅda fรถr att bygga mycket samtidiga, distribuerade och robusta meddelandedrivna applikationer pรฅ JVM.
  • Katter - Leecork รคr ett bibliotek som tillhandahรฅller magmusklertractioner fรถr funktionell programmering.
  • Spark รคr en enhetlig analysmotor fรถr storskalig databehandling, som anvรคnds flitigt i arbetsflรถden inom stordata och maskininlรคrning.

Samtidighetsstรถd

  • Vรคrdena i Scala รคr som standard ofรถrรคnderliga, vilket gรถr den mycket anpassningsbar till samtidiga miljรถer.
  • Scala har mรฅnga funktioner som gรถr den idealisk fรถr samtidiga applikationer.
  • Futures and Promises gรถr det lรคttare att bearbeta data asynkront, vilket stรถdjer parallellism.
  • Akka รคr en verktygslรฅda som anvรคnder aktรถrs-samtidighetsmodellen. Aktรถrer agerar nรคr de tar emot meddelanden.
  • Samtidighet med hjรคlp av trรฅdar frรฅn Java stรถds รคven i Scala.
  • Strรถmbehandling รคr en annan bra funktion som mรถjliggรถr kontinuerlig databehandling i realtid.

Scala har nรฅgra av de bรคsta samtidighetsbiblioteken i Java ekosystem:

  • Native Java trรฅdar.
  • Fibrer frรฅn bibliotek som Vertx.
  • ZIO, ett bibliotek som har primitiva funktioner fรถr att hantera samtidighet och asynkron berรคkning.
  • Programvarutransaktionsminne (STM) fรถr transaktioner.
  • Future, som รคr inbyggt i Scala-sprรฅket.

Java mot Scala

Hรคr รคr de viktigaste skillnaderna 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 objektorienterad och funktionell. Stรถder en mรคngd olika funktionella programmeringsfunktioner sรฅsom samtidighet och ofรถrรคnderlighet. Ursprungligen utvecklat som ett objektorienterat sprรฅk och bรถrjade stรถdja funktionella programmeringsfunktioner i senare versioner. Det รคr fortfarande inte lika starkt som Scala fรถr funktionell programmering.
Anvรคnder aktรถrsmodellen fรถr att stรถdja samtidighet. Anvรคnder den konventionella trรฅdbaserade modellen fรถr samtidighet.
Stรถder ramverk som Play och Lift. Stรถder Spring, Grails och mรฅnga fler.
Stรถder lat utvรคrdering. Stรถder inte lat utvรคrdering inbyggt.
Inga statiska medlemmar. Innehรฅller statiska medlemmar.
Stรถder รถverbelastning av operatรถrer. Stรถder inte operatรถrsรถverbelastning.
Kompilering av kรคllkod รคr jรคmfรถrelsevis lรฅngsam. Kompilering av kรคllkod รคr snabbare รคn Scala.
Egenskaper beter sig som Java 8 grรคnssnitt. Java 8 grรคnssnitt fรถrsรถker รถverbrygga klyftan mellan klasser och grรคnssnitt.
Omskrivning behรถvs ibland vid uppgradering av versioner. Omskrivning krรคvs i allmรคnhet inte mellan versioner.
Typsรคkerhet ger stark kodens tillfรถrlitlighet men ingen absolut garanti fรถr buggfri kod. Stark statisk fรถrmรฅgaping hjรคlper till att minska mรฅnga kรถrtidsfel.
Har vissa begrรคnsningar fรถr bakรฅtkompatibilitet mellan stรถrre versioner. Stark lรฅngsiktig bakรฅtkompatibilitet.
Operators behandlas som metodanrop. Operators รคr speciell syntax och รคr inte metodanrop.
Stรถder multipel nedรคrvning med hjรคlp av egenskaper. Stรถder inte multipel arv med hjรคlp av klasser; anvรคnder grรคnssnitt istรคllet.
Code รคr skriven i kompakt form. Code รคr skriven i en mer utfรถrlig form.
Scala innehรฅller inte det statiska nyckelordet. Java innehรฅller det statiska nyckelordet.

Vanliga frรฅgor

Scala har en brantare inlรคrningskurva รคn Java eftersom den blandar objektorienterade och funktionella stilar. Utvecklare med Java Erfarna personer brukar lรคra sig grunderna snabbt. ร–va med smรฅ projekt och Scala REPL accelererar inlรคrningen.

Ja. Scala fortsรคtter att driva storskaliga system pรฅ fรถretag som anvรคnder Akka, Sparkoch Kafka. Efterfrรฅgan รคr fortsatt stark inom datateknik, fintech och distribuerade system dรคr JVM-prestanda och funktionell programmering รคr vรคrdefulla.

Ja. Moderna AI-kodningsassistenter fรถrstรฅr Scala-syntax, typsystem och ramverk som Akka och SparkDe hjรคlper till att generera standardbeskrivningar, fรถreslรฅ funktionella mรถnster, fรถrklara kompilatorfel och refaktorera kod, vilket pรฅskyndar utvecklingen fรถr bรฅde nybรถrjare och experter.

Scala driver Apache Spark, den ledande motorn fรถr storskalig databehandling i AI-pipelines. Bibliotek som Breeze, Smile och Figaro stรถder numerisk berรคkning, maskininlรคrning och probabilistisk modellering, vilket gรถr Scala till ett starkt val fรถr produktionsdatavetenskap.

Ett vรคrde skapar en ofรถrรคnderlig bindning som utvรคrderas omedelbart. En variabel skapar en fรถrรคnderlig bindning som kan tilldelas om. Ett lazy val skjuter upp utvรคrderingen tills vรคrdet fรถrst anvรคnds och cachar sedan resultatet fรถr efterfรถljande lรคsningar.

Sammanfatta detta inlรคgg med: