Scala Tutorial

Rezumat Tutorial Scala

Acest tutorial scala acoperฤƒ toate aspectele ศ™i subiectele scala. Veศ›i รฎnvฤƒศ›a toate elementele fundamentale de la zero, cum ar fi Ce este scala, procesul de instalare a scala, programele Scala, funcศ›iile Scala, evaluarea leneศ™ฤƒ, interfaศ›a tip, clasele ศ™i obiectele, moศ™tenirea, abstracศ›iile, Java ศ™i diferenศ›e de scala etc.

Ce este Scala?

Scala este un limbaj de programare tip static care รฎncorporeazฤƒ atรขt programarea funcศ›ionalฤƒ, cรขt ศ™i programarea orientatฤƒ pe obiecte pentru a creศ™te scalabilitatea aplicaศ›iilor. Scala ruleazฤƒ รฎn principal pe platforma JVM ศ™i poate fi folosit ศ™i pentru a scrie software pentru platforme native folosind Scala-Native ศ™i JavaScenariu runtime prin ScalaJs.

Scala este un limbaj scalabil folosit pentru a scrie software pentru mai multe platforme. Prin urmare, a primit numele โ€žScalaโ€. Acest limbaj este destinat sฤƒ rezolve problemele Java fiind รฎn acelaศ™i timp mai concis. Proiectat iniศ›ial de Martin Odersky, a fost lansat รฎn 2003.

De ce sฤƒ รฎnveศ›i Scala

Iatฤƒ principalele motive pentru a รฎnvฤƒศ›a limbajul de programare Scala:

  • Scala este uศ™or de รฎnvฤƒศ›at pentru programatorii orientaศ›i pe obiecte, Java dezvoltatori. Devine una dintre limbile populare รฎn ultimii ani.
  • Scala oferฤƒ utilizatorilor funcศ›ii de primฤƒ clasฤƒ
  • Scala poate fi executat pe FMV, deschizรขnd astfel calea pentru interoperabilitatea cu alte limbi.
  • Este conceput pentru aplicaศ›ii care sunt concurente, distribuite ศ™i rezistente bazate pe mesaje. Este una dintre cele mai solicitante limbi ale acestui deceniu.
  • Este un limbaj concis, puternic ศ™i poate creศ™te rapid รฎn funcศ›ie de cererea utilizatorilor sฤƒi.
  • Este orientat pe obiecte ศ™i are o mulศ›ime de caracteristici funcศ›ionale de programare, oferind multฤƒ flexibilitate dezvoltatorilor de a codifica รฎn modul dorit.
  • Scala oferฤƒ multe tipuri de raศ›ฤƒ
  • Are mai puศ›in boilerplate dacฤƒ vii din Java
  • Cadrele Lift and Play scrise รฎn Scala sunt รฎn curba de creศ™tere.

Cum se instaleazฤƒ Scala

Pentru a รฎncepe sฤƒ scrieศ›i programe Scala, trebuie sฤƒ รฎl aveศ›i instalat pe computer. Pentru a face acest lucru, va trebui sฤƒ vizitaศ›i site-ul lor https://www.scala-lang.org/download/ pentru a descฤƒrca cea mai recentฤƒ versiune de Scala.

Urmรขnd link-ul, suntem conduศ™i la douฤƒ opศ›iuni pe care le putem alege sฤƒ instalฤƒm Scala pe maศ™inile noastre. Pentru acest tutorial Scala, vom descฤƒrca IntelliJ IDEA.

Cum se instaleazฤƒ Scala

Odatฤƒ ce accesaศ›i linkul de descฤƒrcare, veศ›i gฤƒsi douฤƒ versiuni ale IntelliJ IDE.

Pentru acest tutorial Scala, vom descฤƒrca ediศ›ia comunitarฤƒ, care este gratuitฤƒ ศ™i vine cu tot ce aveศ›i nevoie pentru a scrie programe Scala.

Cum se instaleazฤƒ Scala

Pas 1) Selectaศ›i Community Edition
Pe paginฤƒ, faceศ›i clic pe meniul drop-down din Community Edition.

Ne prezintฤƒ o opศ›iune de a descฤƒrca IDE-ul IntelliJ รฎmpreunฤƒ cu JBR care conศ›ine o implementare JDK (Java Development Kit) OpenJDK de care Scala are nevoie pentru a compila ศ™i a rula codul.

Cum se instaleazฤƒ Scala

Pas 2) Rulaศ›i instalarea
Dupฤƒ ce descฤƒrcaศ›i IntelliJ, faceศ›i dublu clic pe el pentru a rula asistentul de instalare ศ™i urmaศ›i dialogul.

Cum se instaleazฤƒ Scala

Pas 3) Selectaศ›i o locaศ›ie
Alegeศ›i o locaศ›ie pentru a instala IDE-ul.

Cum se instaleazฤƒ Scala

Dacฤƒ din รฎntรขmplare nu l-aศ›i descฤƒrcat pe cel cu JDK, primim totuศ™i o solicitare รฎn care putem verifica pentru a-l descฤƒrca bifรขnd caseta de selectare.

Cum se instaleazฤƒ Scala

Pas 4) Faceศ›i clic pe urmฤƒtorul
Lฤƒsaศ›i celelalte setฤƒri implicite aศ™a cum sunt ศ™i faceศ›i clic pe Urmฤƒtorul.

Cum se instaleazฤƒ Scala

Pas 5) Faceศ›i clic pe pictograma de pornire
Dupฤƒ finalizarea instalฤƒrii, rulaศ›i IntelliJ IDE fฤƒcรขnd clic pe pictograma de pornire din meniul de pornire ca o aplicaศ›ie obiศ™nuitฤƒ.

Cum se instaleazฤƒ Scala

รŽncฤƒ trebuie sฤƒ parcurgeศ›i un pas suplimentar de adฤƒugare a pluginului Scala la IntelliJ; faceศ›i acest lucru fฤƒcรขnd clic pe meniul derulant din meniul de configurare situat รฎn partea dreaptฤƒ jos a ecranului ศ™i selectรขnd opศ›iunea de plugin.

Cum se instaleazฤƒ Scala

Cum se instaleazฤƒ Scala

รŽn fila Piaศ›ฤƒ, o cฤƒutare pentru Scala va prezenta pluginul ca prim rezultat sub eticheta Limbi.

Pas 6) Instalaศ›i pluginul
Faceศ›i clic pe instalare, ceea ce va conduce pluginul la รฎnceputul descฤƒrcarii.

Cum se instaleazฤƒ Scala

Pas 7) Reporniศ›i IDE-ul
Dupฤƒ finalizarea descฤƒrcฤƒrii, vi se va solicita sฤƒ reporniศ›i IDE-ul, astfel รฎncรขt pluginul instalat sฤƒ poatฤƒ รฎncepe sฤƒ funcศ›ioneze.

Cum se instaleazฤƒ Scala

Dupฤƒ repornire, vฤƒ veศ›i gฤƒsi pe aceeaศ™i paginฤƒ ca รฎnainte cรขnd am rulat IDE-ul, dar de data aceasta am instalat deja pluginul Scala.

Programul Scala Hello World

Pas 1) Selectaศ›i opศ›iunea Creare proiect, care ne va conduce la o paginฤƒ รฎn care putem selecta tipul de limbฤƒ pe care o va folosi proiectul nostru.

Programul Scala Hello World

Pas 2) alegeศ›i Scala bifรขnd caseta de selectare Scala ศ™i faceศ›i clic pe urmฤƒtorul.

Programul Scala Hello World

Pas 3) Selectaศ›i o locaศ›ie pentru a salva fiศ™ierul proiectelor noastre ศ™i daศ›i un nume proiectului nostru.

Programul Scala Hello World

Dacฤƒ directorul nu existฤƒ, IntelliJ ne va cere sฤƒ ne cerem permisiunea de a crea folderul. Acceptaศ›i ศ™i faceศ›i clic pe Terminare. Veศ›i fi dus la proiectul dvs. Scala, care รฎn prezent nu are niciun cod Scala.

Va dura ceva timp pentru a รฎncฤƒrca niศ™te indexuri, aศ™a cฤƒ nu vฤƒ faceศ›i griji dacฤƒ nu puteศ›i face imediat nimic รฎn timp ce existฤƒ o barฤƒ de progres รฎn partea de jos a IDE-ului dvs., รฎnseamnฤƒ pur ศ™i simplu IDE-ul dvs. รฎncarcฤƒ unele fiศ™iere necesare pentru a rula Scala ศ™i ajutor cu completarea automatฤƒ IDE.

Pas 4) Apoi, vom face clic pe fila proiecte din stรขnga IDE-ului ศ™i vom extinde astfel รฎncรขt sฤƒ putem vedea conศ›inutul proiectului nostru.

Programul Scala Hello World

Momentan proiectul este gol ศ™i conศ›ine doar un folder .idea ศ™i un fiศ™ier hello-world.iml generat de IDE. Punctul nostru de interes este folderul src. Src este locul รฎn care stocฤƒm codul sursฤƒ pentru proiectul nostru. Aici vom crea primul nostru fiศ™ier Scala.

Pas 5) Faceศ›i clic dreapta pe src pentru a deschide un meniu pentru a crea un nou fiศ™ier Scala.

Creaศ›i un nou fiศ™ier Scala

Vom crea apoi un nume pentru fiศ™ier, รฎn acest tutorial Scala vom folosi salut ศ™i apoi vom alege dintr-un meniu derulant ce sฤƒ punem ca conศ›inut al fiศ™ierului Scala. Selectaศ›i โ€žObiectโ€

Programul Scala Hello World

Odatฤƒ ce facem acest lucru, vom avea un fiศ™ier Scala care are un obiect Singleton pe care รฎl vom folosi pentru a rula codul nostru.

Programul Scala Hello World

Acum cฤƒ aveศ›i un fiศ™ier Scala cu un obiect Hello. Veศ›i scrie primul program extinzรขnd obiectul pe care l-aศ›i creat folosind cuvรขntul cheie App.

Extinderea obiectului nostru cu App spuneศ›i compilatorului ce cod sฤƒ ruleze atunci cรขnd porneศ™te programul. Imediat dupฤƒ extinderea aplicaศ›iei, รฎn partea stรขngฤƒ apare o sฤƒgeatฤƒ verde, indicรขnd cฤƒ acum puteศ›i rula programul.

Programul Scala Hello World

Programul Scala Hello World

รŽn interiorul obiectului Hello, scriem o funcศ›ie println() care este folositฤƒ pentru a tipฤƒri textul din interiorul acestuia pe consolฤƒ. Vom rula codul fฤƒcรขnd clic pe sฤƒgeata verde.

Fฤƒcรขnd clic pe sฤƒgeatฤƒ, ne prezintฤƒ opศ›iunea Run, hello, dupฤƒ ce facem clic pe ea, codul nostru va รฎncepe compilarea ศ™i dupฤƒ cรขteva secunde vom vedea rezultatele programului nostru tipฤƒrite din consola care este รฎncorporatฤƒ รฎn IntelliJ IDE.

Programul Scala Hello World

ศ˜i iatฤƒ-ne, am instalat cu succes Scala ศ™i am rulat primul nostru program.

Ce poศ›i face cu Scala

  • Dezvoltare web front-end cu ScalaJS
  • Dezvoltare mobilฤƒ, ambele Android Dezvoltare ศ™i IOS โ€“ cu Scala Native
  • Biblioteci de pe partea serverului, cum ar fi HTTP4S, Akka-Http, Play Framework
  • Utilizarea internetului lucrurilor
  • Dezvoltarea jocului
  • NLP โ€“ Procesarea limbajului natural folosind o suitฤƒ de biblioteci ScalaNLP
  • Testarea tehnicilor avansate de programare, cum ar fi programarea funcศ›ionalฤƒ ศ™i programarea orientatฤƒ pe obiecte
  • Construiศ›i aplicaศ›ii de comunicare extrem de concurente folosind actori o bibliotecฤƒ pentru JVM inspiratฤƒ de Erlang
  • Folosiศ›i-l pentru รฎnvฤƒศ›area automatฤƒ folosind biblioteci precum Figaro care face programare probabilisticฤƒ ศ™i Apache Spark acea

Funcศ›ii anonime

Limbajul Scala are funcศ›ii anonime, care sunt ศ™i numite literali de funcศ›ie. Scala fiind un limbaj funcศ›ional รฎnseamnฤƒ adesea cฤƒ dezvoltatorii descompun problemele mari รฎn multe sarcini mici ศ™i creeazฤƒ multe funcศ›ii pentru a rezolva aceste probleme. Pentru a facilita crearea de funcศ›ii, Scala conศ›ine aceste funcศ›ii care pot fi instanศ›iat fฤƒrฤƒ nume. Le putem atribui direct variabilelor sau definiศ›iilor โ€ždefโ€, aศ™a cum se aratฤƒ รฎn exemplul Scala de mai jos:

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

Apoi putem folosi modul normal รฎn care folosim funcศ›iile, pasรขnd parametrii acestora.

multiplyByTwo(3)

//6

multiplyByThree(4)

//12

Aceste metode sunt utile atunci cรขnd dorim sฤƒ avem un cod curat ศ™i concis. Putem folosi funcศ›ii anonime atunci cรขnd definim metode care nu sunt mari ศ™i nu necesitฤƒ mult cod รฎn corpul lor. Sunt foarte simple ศ™i nu au nevoie de o ceremonie pentru a le crea.

Aceste metode nu se limiteazฤƒ la funcศ›ii cu argumente ศ™i pot fi folosite pentru a instanศ›ia metode care nu preiau niciun argument.

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

Cele mai multe dintre aceste funcศ›ii anonime sunt utilizate รฎn alte pฤƒrศ›i ale codului nostru, unde trebuie sฤƒ creฤƒm o funcศ›ie rapidฤƒ.

Un alt motiv pentru care aceste funcศ›ii sunt denumite ศ™i ca funcศ›ii inline. Utilizarea funcศ›iilor anonime este un model obiศ™nuit care este utilizat รฎn mod general รฎn biblioteca colecศ›iilor pentru a efectua acศ›iuni rapide asupra unei colecศ›ii.

De exemplu, avem metoda de filtru care necesitฤƒ o funcศ›ie inline/funcศ›ie anonimฤƒ pentru a crea o altฤƒ colecศ›ie cu doar elemente care รฎndeplinesc criteriile pe care le definim รฎn funcศ›ia anonimฤƒ.

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)

Aici metodele pe care le avem ca funcศ›ii anonime sunt cele care verificฤƒ dacฤƒ valoarea pe care o primim din listฤƒ este parฤƒ ศ™i imparฤƒ ศ™i returneazฤƒ elementul.

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

รŽn Scala, este, de asemenea, posibil sฤƒ folosiศ›i metacaracterele unde parametrul funcศ›iei noastre anonime nu este denumit. De exemplu

var timesTwo = (_:Int)*2

timesTwo(5)
//10

รŽn acest scenariu, nu denumim parametrul pe care รฎl transmitem. Singurul lucru pe care รฎl folosim un caracter de subliniere pentru a-l reprezenta.

Evaluare leneศ™ฤƒ

Majoritatea limbilor evalueazฤƒ secvenลฃial variabilele ลŸi parametrii funcลฃiei, unul dupฤƒ altul. รŽn Scala, avem un cuvรขnt cheie numit lazy, care ajutฤƒ la tratarea valorilor pe care nu dorim sฤƒ fie evaluate pรขnฤƒ cรขnd nu sunt referite.

O variabilฤƒ marcatฤƒ ca leneศ™ nu va fi evaluatฤƒ acolo unde este definitฤƒ, care este cunoscutฤƒ รฎn mod obiศ™nuit ca evaluare dornicฤƒ, va fi evaluatฤƒ doar atunci cรขnd este referitฤƒ mai tรขrziu รฎn cod.

Acest lucru poate fi util atunci cรขnd evaluarea unei valori ar putea fi un calcul costisitor, dacฤƒ nu este cazul รฎn care valoarea este รฎntotdeauna necesarฤƒ, ne putem salva de a rula un calcul costisitor care poate รฎncetini software-ul nostru fฤƒcรขnd variabila leneศ™ฤƒ.

lazy val myExpensiveValue = expensiveComputation

def runMethod()={
    if(settings == true){
        use(myExpensiveValue)
    }else{
        use(otherValue)
    }
}

Acesta nu este singurul caz de utilizare pentru variabilele leneศ™e. De asemenea, ajutฤƒ la rezolvarea problemelor legate de dependenศ›a circularฤƒ รฎn cod.

รŽn cazul รฎn care setฤƒrile sunt false, s-ar putea sฤƒ nu fie nevoie sฤƒ folosim myExpensiveValue, ceea ce ne poate determina sฤƒ ne salvฤƒm de la efectuarea unui calcul costisitor care ne ajutฤƒ sฤƒ ne asigurฤƒm cฤƒ utilizatorii se distreazฤƒ bine folosind aplicaศ›ia noastrฤƒ, deoarece celelalte nevoi ale lor pot fi calculate corect, fฤƒrฤƒ a fi copleศ™ite. Berbecul.

รŽn cazul รฎn care setฤƒrile sunt false, s-ar putea sฤƒ nu fie nevoie sฤƒ folosim myExpensiveValue, ceea ce ne poate determina sฤƒ ne salvฤƒm de la efectuarea unui calcul costisitor, ceea ce ne ajutฤƒ sฤƒ ne asigurฤƒm cฤƒ utilizatorii se simt bine folosind aplicaศ›ia noastrฤƒ, deoarece celelalte nevoi ale lor pot fi calculate รฎn mod corespunzฤƒtor, fฤƒrฤƒ a fi copleศ™ite. Berbecul.

Lenea ajutฤƒ ศ™i cu argumentele funcศ›iei, unde argumentele sunt folosite doar atunci cรขnd sunt referite รฎn interiorul funcศ›iei. Acest concept se numeศ™te parametri de apelare dupฤƒ nume.

def sometimesUsedString(someValue:String, defaultValue:=> String)={
 if(someValue != null){
   use(defaultValue)
 }else{
   use(someValue)
   }
 }

Multe limbi folosesc modul apel-dupฤƒ-valoare de a evalua argumentele. Parametrul trecut prin call-by-name va fi evaluat numai atunci cรขnd este necesar รฎn corpul funcศ›iei ศ™i nu va fi evaluat รฎnainte. Odatฤƒ evaluatฤƒ valoarea, aceasta este stocatฤƒ ศ™i poate fi reutilizatฤƒ ulterior fฤƒrฤƒ a fi necesarฤƒ reevaluarea. Un concept cunoscut sub numele de memorare.

Tip Inferenศ›ฤƒ

รŽn Scala, nu trebuie sฤƒ declaraศ›i tipuri pentru fiecare variabilฤƒ pe care o creaศ›i. Acest lucru se datoreazฤƒ faptului cฤƒ compilatorul Scala poate face inferenศ›e de tip pe tipuri pe baza evaluฤƒrii pฤƒrศ›ii din dreapta. Acest lucru permite codului dvs. sฤƒ fie mai concis - ne elibereazฤƒ de la scrierea de tip boilerplate unde tipul aศ™teptat este evident

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

Funcศ›ie de ordin superior

O funcศ›ie de ordin superior este o funcศ›ie care poate lua funcศ›ii ca argumente ศ™i poate returna o funcศ›ie ca tip de returnare. La Scala, funcศ›iile sunt considerate cetฤƒศ›eni de primฤƒ clasฤƒ. Folosirea acestor funcศ›ii รฎn acest fel ne permite sฤƒ fim foarte flexibili รฎn ceea ce priveศ™te tipurile de programe pe care le putem realiza. Putem crea funcศ›ii รฎn mod dinamic ศ™i putem alimenta funcศ›ionalitฤƒศ›i รฎn mod dinamic altor funcศ›ii.

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

รŽn funcศ›ia de mai sus, trecem un int ศ™i o funcศ›ie care ia un int ศ™i returneazฤƒ un int. Putem trece รฎn orice funcศ›ie a acelei semnฤƒturi. Prin semnฤƒturฤƒ, รฎnศ›elegem intrarea ศ™i ieศ™irea unei funcศ›ii. O semnฤƒturฤƒ a lui Int=>Int รฎnseamnฤƒ cฤƒ o funcศ›ie ia un Int ca intrare ศ™i returneazฤƒ un Int ca ieศ™ire.

O semnฤƒturฤƒ de ()=>Int รฎnseamnฤƒ cฤƒ o funcศ›ie nu ia nimic ca intrare ศ™i returneazฤƒ un Int ca ieศ™ire. Un exemplu de funcศ›ie ca acesta ar fi unul care genereazฤƒ un int aleatoriu pentru noi.

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

Funcศ›ia de mai sus are o semnฤƒturฤƒ () => Int

Putem avea o funcศ›ie care are o semnฤƒturฤƒ scala ()=>Unit. Aceasta รฎnseamnฤƒ cฤƒ funcศ›iile nu preiau nimic ศ™i nu returneazฤƒ un tip. Funcศ›ia ar putea face un fel de calcul schimbรขnd ceva รฎn a face ceva predeterminat.

Cu toate acestea, aceste tipuri de metode nu sunt รฎncurajate, deoarece par a fi o cutie neagrฤƒ care poate afecta un sistem รฎn anumite moduri necunoscute. Sunt, de asemenea, netestabile. Avรขnd tipuri explicite de intrare ศ™i ieศ™ire, ne permite sฤƒ raศ›ionฤƒm cu privire la ceea ce face funcศ›ia noastrฤƒ.

O funcศ›ie de ordin superior poate returna ศ™i o funcศ›ie.

De exemplu, am putea crea o metodฤƒ care va crea o funcศ›ie de alimentare, adicฤƒ ia un numฤƒr ศ™i รฎi aplicฤƒ putere.

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

Funcศ›ia de mai sus ia un int. Tipul nostru returnat este o funcศ›ie anonimฤƒ care ia un Int x, * folosim int x ca argument pentru funcศ›ia de putere.

curry

รŽn Scala, putem converti o funcศ›ie care ia douฤƒ argumente รฎntr-una care ia cรขte un argument la un moment dat. Cรขnd introducem un argument, รฎl aplicฤƒm parศ›ial ศ™i ajungem la o funcศ›ie care ia un argument pentru a finaliza funcศ›ia. Currying ne permite sฤƒ creฤƒm funcศ›ii prin adฤƒugarea parศ›ialฤƒ a unor argumente.

Acest lucru poate fi util pentru a crea funcศ›ii รฎn mod dinamic รฎnainte de a avea un set complet de argumente

def multiply two numbers(n:Int)(m:Int): Unit ={
  return n * m
}

Dacฤƒ trebuie sฤƒ creฤƒm o funcศ›ie care se รฎnmulศ›eศ™te cu un anumit numฤƒr, nu trebuie sฤƒ creฤƒm o altฤƒ metodฤƒ de รฎnmulศ›ire.

Putem apela pur ศ™i simplu .curried pe funcศ›ia noastrฤƒ de mai sus ศ™i obศ›inem o funcศ›ie care ia mai รฎntรขi un argument ศ™i returneazฤƒ o funcศ›ie aplicatฤƒ parศ›ial

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

var multiplyByFive = multiplyTwoNumbers(5) 

multiplyByFive(4)

//returns 20

Potrivire de model

Scala are un mecanism puternic รฎncorporat pentru a ne ajuta sฤƒ verificฤƒm dacฤƒ o variabilฤƒ se potriveศ™te cu anumite criterii, la fel cum am face รฎntr-o declaraศ›ie switch รฎn Java sau รฎntr-o serie de afirmaศ›ii if/else. Limbajul are potrivire de tipare pe care o putem folosi pentru a verifica dacฤƒ o variabilฤƒ este de un anumit tip. Potrivirea modelelor รฎn Scala este puternicฤƒ ศ™i poate fi folositฤƒ pentru a destructura componentele care au o metodฤƒ neaplicatฤƒ pentru a obศ›ine cรขmpurile care ne intereseazฤƒ direct din variabila pe care o potrivim.

Potrivirea modelului Scala oferฤƒ, de asemenea, o sintaxฤƒ mai plฤƒcutฤƒ รฎn comparaศ›ie cu declaraศ›ia switch.

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

Ne comparฤƒm variabila cu un set de opศ›iuni, iar cรขnd variabila pe care o potrivim รฎndeplineศ™te criteriile, expresia din partea dreaptฤƒ a sฤƒgeศ›ii grase (=>) evalueazฤƒ ศ™i este returnatฤƒ ca rezultat al potrivirii.

Folosim un caracter de subliniere pentru a identifica cazurile care nu sunt egalate รฎn codul nostru. Oglindeศ™te comportamentul cazului implicit atunci cรขnd se ocupฤƒ de instrucศ›iunile switch.

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
}

รŽn codul de mai sus, puteศ›i afla tipul variabilei myItem ศ™i, pe baza acelui cod, puteศ›i gฤƒsi un anumit cod.

Potrivirea modelului verificฤƒ dacฤƒ variabila se potriveศ™te

Sublinierea funcศ›ioneazฤƒ ca un substituent care se potriveศ™te cu orice altฤƒ condiศ›ie care nu este potrivitฤƒ de celelalte elemente din declaraศ›iile de mai sus. Luฤƒm o variabilฤƒ myItem ศ™i apelฤƒm metoda potrivirii.

  • verificฤƒm dacฤƒ myItem este adevฤƒrat folosind ศ™i facem ceva logic รฎn partea dreaptฤƒ a sฤƒgeศ›ii grase โ€ž=>.โ€
  • folosim caracterul de subliniere pentru a se potrivi cu orice nu se potriveศ™te cu oricare dintre declaraศ›iile case pe care le-am definit รฎn cod.

Cu clasele Case, putem chiar sฤƒ mergem mai departe ศ™i sฤƒ destructuram clasa pentru a obศ›ine cรขmpuri รฎn interiorul obiectului.

Folosind cuvรขntul cheie sigilat pentru a ne defini clasele, obศ›inem beneficiul de a avea compilatorul sฤƒ verifice รฎn mod exhaustiv cazurile cu care รฎncercฤƒm sฤƒ le potrivim ศ™i sฤƒ ne avertizeze dacฤƒ uitฤƒm sฤƒ ne ocupฤƒm de unul anume.

Imuabilitate

Este posibil sฤƒ creaศ›i valori care nu pot fi modificate de alte funcศ›ii รฎn Scala folosind cuvรขntul cheie val. Acest lucru se realizeazฤƒ รฎn Java prin utilizarea cuvรขntului cheie final. รŽn Scala, facem acest lucru folosind un cuvรขnt cheie val atunci cรขnd creฤƒm o variabilฤƒ รฎn loc de a folosi var, care este alternativa pe care am folosi-o pentru a crea o variabilฤƒ mutabilฤƒ.

O variabilฤƒ definitฤƒ folosind cuvรขntul cheie val este doar pentru citire, รฎn timp ce una definitฤƒ cu var poate fi cititฤƒ ศ™i modificatฤƒ de alte funcศ›ii sau รฎn mod arbitrar de cฤƒtre utilizator รฎn cod.

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

รŽncercarea de a atribui o valoare lui Numฤƒrul meu dupฤƒ ce am declarat-o ca val, genereazฤƒ o eroare de compilare sau โ€žreatribuire la valโ€.

De ce sฤƒ folosiศ›i Imutabilitatea?

Imuabilitatea ne ajutฤƒ sฤƒ รฎmpiedicฤƒm codul ศ™i alศ›i programatori sฤƒ ne schimbe valorile รฎn mod neaศ™teptat, ceea ce ar duce la rezultate neaศ™teptate, dacฤƒ ar trebui sฤƒ utilizeze valoarea pe care o stocฤƒm, o pot face รฎn schimb o copie a acesteia. รŽn acest fel, sunt prevenite erorile care pot fi cauzate de mai mulศ›i actori care modificฤƒ aceeaศ™i variabilฤƒ.

Clase ศ™i obiecte

ศ˜tim cu toศ›ii cฤƒ obiectele sunt entitฤƒศ›ile din lumea realฤƒ, iar clasa este un ศ™ablon care defineศ™te obiectele. Clasele au atรขt stare, cรขt ศ™i comportamente. Stฤƒrile sunt fie valori, fie variabile. Comportamentele sunt metodele din Scala.

Sฤƒ ne uitฤƒm la modul รฎn care poศ›i defini o clasฤƒ, sฤƒ o instanศ›iezi ศ™i sฤƒ o foloseศ™ti folosind Scala.

Aici, clasa numitฤƒ Rectangle, care are douฤƒ variabile ศ™i douฤƒ funcศ›ii. De asemenea, puteศ›i utiliza parametrii l ศ™i b direct ca cรขmpuri รฎn program. Aveศ›i un obiect care are o metodฤƒ principalฤƒ ศ™i a instanศ›iat clasa cu douฤƒ valori.

Exemplu:

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

Toate cรขmpurile ศ™i metoda sunt รฎn mod implicit publice รฎn Scala. Este esenศ›ial sฤƒ utilizaศ›i override deoarece metoda toString este definitฤƒ pentru Object รฎn Scala.

MoลŸtenire

Scala are mai multe tipuri de moศ™tenire (cum ar fi un singur, multi-nivel, multiplu, ierarhic, hibrid) care au multe รฎn comun cu formele tradiศ›ionale gฤƒsite รฎn Java. Puteศ›i moศ™teni atรขt din clase, cรขt ศ™i din trฤƒsฤƒturi. Puteศ›i moศ™teni membrii unei clase รฎntr-o altฤƒ clasฤƒ folosind cuvรขntul cheie โ€žextindeโ€. Acest lucru permite reutilizarea.

Este posibil sฤƒ moศ™teniศ›i dintr-o clasฤƒ sau mai multe clase. De asemenea, este posibil sฤƒ se moศ™teneascฤƒ din subclase care au ele รฎnsele superclasele, creรขnd o ierarhie de moศ™tenire รฎn acest proces.

รŽn exemplul Scala de mai jos, clasa de bazฤƒ este Cerc, iar clasa derivatฤƒ este Sferฤƒ. Un cerc are o valoare numitฤƒ razฤƒ, care este moศ™tenitฤƒ รฎn clasa Sphere. Metoda calcArea este suprascrisฤƒ folosind cuvรขntul cheie override.

Exemplu:

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

abstracศ›iune

รŽn Scala, putem crea metode abstracte ศ™i cรขmpuri membre folosind clase ศ™i trฤƒsฤƒturi abstracte. รŽn interiorul claselor ศ™i trฤƒsฤƒturilor abstracte, putem defini cรขmpuri abstracte fฤƒrฤƒ a le implementa neapฤƒrat.

Exemplu:

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

Aceste cรขmpuri sunt implementate de clasele care extind trฤƒsฤƒtura sau clasa abstractฤƒ. Puteศ›i folosi trฤƒsฤƒturi pentru a crea contracte cu privire la ceea ce aplicaศ›ia noastrฤƒ ar trebui sฤƒ poatฤƒ face ศ™i apoi implementaศ›i acele metode mai tรขrziu.

trait DatabaseService{
    def addItemName(itemName:String)
    def removeItem(itemId:Int)
    def updateItem(itemId:Int, newItemName:String)
}

รŽn acest fel, putem planifica cum va arฤƒta aplicaศ›ia noastrฤƒ fฤƒrฤƒ a implementa metodele care ne pot ajuta sฤƒ ne imaginฤƒm cum vor arฤƒta diferite metode. Urmeazฤƒ de-a lungul unui model cunoscut ca programare la abstracศ›ii ศ™i nu implementarea propriu-zisฤƒ.

Clasa care este prefaศ›atฤƒ cu cuvรขntul cheie abstract poate conศ›ine atรขt metode abstracte, cรขt ศ™i non-abstracte. Dar, moศ™tenirile multiple nu sunt acceptate รฎn clasa abstractฤƒ. Deci, puteศ›i extinde cel mult o clasฤƒ abstractฤƒ.

Obiecte Singleton

Un Singleton este o clasฤƒ care este instanศ›iatฤƒ o singurฤƒ datฤƒ รฎntr-un program. Este dintr-un model de programare popular ศ™i util cunoscut sub numele de โ€žmodel singletonโ€. Este util รฎn crearea instanศ›elor care sunt menite sฤƒ aibฤƒ o viaศ›ฤƒ lungฤƒ ศ™i care vor fi accesate รฎn mod obiศ™nuit รฎn programul dvs. a cฤƒror stare este parte integrantฤƒ รฎn coordonarea evenimentelor unui sistem. Crearea unei astfel de clase รฎn Scala este uศ™oarฤƒ, deoarece Scala ne oferฤƒ un mijloc simplu de a crea singletonuri folosind cuvรขntul cheie obiect.

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

Apoi putem face referire la acest obiect รฎn programul nostru, cu garanศ›ia cฤƒ toate pฤƒrศ›ile programului nostru vor vedea aceleaศ™i date, deoarece existฤƒ o singurฤƒ instanศ›ฤƒ a acestuia.

def getLoggedInStatus():Boolean={
   return UserProfile.isLoggedIn
}

def changeLoggedInStatus():Boolean={
    UserProfile.isLoggedIn = !UserProfile.isLoggedIn
    return  UserProfile.isLoggedIn
}

Conceptul de membri statici nu existฤƒ รฎn Scala, acesta este motivul pentru care trebuie sฤƒ utilizaศ›i obiecte singleton, care acศ›ioneazฤƒ ca membri statici ai unei clase.

Clasele implicite

Clasele implicite sunt noua funcศ›ionalitate adฤƒugatฤƒ dupฤƒ versiunea 2.1. Este รฎn primul rรขnd pentru a adฤƒuga noi funcศ›ionalitฤƒศ›i la clasele รฎnchise.

Cuvรขntul cheie implicit ar trebui definit รฎntr-o clasฤƒ, obiect sau trฤƒsฤƒturฤƒ. Constructorul primar al unei clase implicite ar trebui sฤƒ aibฤƒ exact un argument รฎn prima sa listฤƒ de parametri. Poate include, de asemenea, o listฤƒ suplimentarฤƒ de parametri impliciti.

รŽn exemplul Scala de mai jos, se adaugฤƒ o nouฤƒ funcศ›ionalitate pentru a รฎnlocui vocalele unui ศ™ir cu *.

object StringUtil {
  implicit class StringEnhancer(str: String) {
    
    def replaceVowelWithStar: String = str.replaceAll("[aeiou]", "*")
  }
}

Trebuie sฤƒ importaศ›i รฎn clasa รฎn care รฎl utilizaศ›i.

import StringUtil.StringEnhancer

object ImplicitEx extends App {
  val msg = "This is Guru99!"
  println(msg.replaceVowelWithStar)
}

Programare orientatฤƒ pe obiecte (OOP) vs. Programare funcศ›ionalฤƒ (FP)

รŽn OOP, programele sunt construite prin gruparea datelor ศ™i a funcศ›iilor care opereazฤƒ pe acele date รฎn unitฤƒศ›i puternic conectate. Obiectele รฎศ™i poartฤƒ datele รฎn cรขmpurile ศ™i metodele care opereazฤƒ asupra lor. รŽn acest stil de programare, principala abstractizare sunt datele, deoarece metodele care sunt create sunt menite sฤƒ opereze asupra datelor.

Programare funcศ›ionalฤƒ, pe de altฤƒ parte, separฤƒ datele ศ™i funcศ›iile care opereazฤƒ asupra datelor. Acest lucru le permite dezvoltatorilor sฤƒ trateze funcศ›iile ca forศ›ฤƒ de abstractizare ศ™i forศ›ฤƒ motrice atunci cรขnd modeleazฤƒ programe.

Scala permite programarea funcศ›ionalฤƒ avรขnd funcศ›ii ca cetฤƒศ›eni de primฤƒ clasฤƒ, permiศ›รขndu-le sฤƒ fie transmise ca valori cฤƒtre alte funcศ›ii ศ™i returnate, de asemenea, ca valori. Combinaศ›ia acestor douฤƒ paradigme a fฤƒcut din Scala o alegere excelentฤƒ รฎn construirea de software complex รฎn diverse industrii, cum ar fi Data Science.

Cadre importante pe Scala

Iatฤƒ cรขteva cadre importante ale Scala

  • Joaca este un cadru de aplicaศ›ii web open-source care utilizeazฤƒ Arhitectura MVC. Lansat รฎn 2007 ศ™i acum licenศ›iat sub Apache, A devenit cel mai popular cadru de pe GitHub รฎn 2013. Companii precum LinkedIn, Walmart, Samsung, Eero folosesc acest cadru.
  • Ridicare este un alt framework web gratuit scris รฎn Scala lansat รฎn 2007. Foursquare foloseศ™te framework-ul Lift. Este un cadru performant, mai rapid de construit.
  • Acru
  • Pisici
  • Spark

Suport simultan

  • Valorile din Scala sunt implicit imuabile. Acest lucru รฎl face foarte adaptabil la mediul concurent.
  • Existฤƒ o mulศ›ime de caracteristici รฎn Scala care รฎl fac cel mai bun pentru aplicaศ›iile concurente.
  • Futures and Promises faciliteazฤƒ procesarea asincronฤƒ a datelor, susศ›inรขnd astfel paralelismul.
  • Akka โ€“ set de instrumente care utilizeazฤƒ modelul de concurenศ›ฤƒ Actor. Existฤƒ o serie de Actori care acศ›ioneazฤƒ atunci cรขnd primesc mesaje.
  • Concurenศ›ฤƒ folosind fire din Java poate fi suportat ศ™i รฎn Scala.
  • Procesarea fluxului este o altฤƒ caracteristicฤƒ excelentฤƒ care permite procesarea continuฤƒ, รฎn timp real, a datelor.

Scala are unele dintre cele mai bune biblioteci de concurenศ›ฤƒ din Java ecosistem.

  • Nativ Java fire
  • Fibre din biblioteci precum Vertex
  • ZIO โ€“ o bibliotecฤƒ care are primitive pentru a ne ajuta sฤƒ ne ocupฤƒm de concurenศ›a ศ™i calculul asincron
  • STM โ€“ Tranzacศ›ie
  • Viitorul โ€“ รฎncorporat รฎn limbajul Scala

Java vs Scala

Iatฤƒ care sunt principalele diferenศ›ฤƒ รฎntre Java ศ™i Scala.

Scala Java
Mai compact ศ™i mai concis Bucฤƒศ›i de cod relativ mai mari
Proiectat ศ™i dezvoltat pentru a fi atรขt limbaj orientat pe obiect, cรขt ศ™i funcศ›ional.
Acceptฤƒ o mare varietate de caracteristici funcศ›ionale de programare, cum ar fi concurenศ›a, Imuabilitatea.
S-a dezvoltat iniศ›ial ca un limbaj orientat pe obiecte ศ™i a รฎnceput sฤƒ accepte funcศ›ii de programare funcศ›ionale รฎn ultimele zile. รŽncฤƒ nu este puternic ca limbaj de programare funcศ›ional.
Utilizeazฤƒ modelul de actor pentru a susศ›ine concurenศ›a, care este modern Utilizeazฤƒ modelul convenศ›ional bazat pe fire pentru concurenศ›ฤƒ.
Acceptฤƒ cadre โ€“ Play, Lift Suporta Spring, Grails, multe altele
Sprijinฤƒ evaluarea leneศ™ฤƒ Nu acceptฤƒ evaluarea leneศ™ฤƒ
Fฤƒrฤƒ membri statici Conศ›ine membri statici
Acceptฤƒ supraรฎncฤƒrcarea operatorului Nu acceptฤƒ supraรฎncฤƒrcarea operatorului
Compilarea codului sursฤƒ este relativ lentฤƒ Compilarea codului sursฤƒ este mai rapidฤƒ decรขt Scala
Trฤƒsฤƒturi โ€“ acศ›ioneazฤƒ ca Java 8 interfeศ›e Java 8 interfeศ›e รฎncearcฤƒ sฤƒ reducฤƒ decalajul dintre clase ศ™i interfeศ›e
Este nevoie de rescriere Rescrierea nu este necesarฤƒ
Nicio asigurare cu privire la codurile fฤƒrฤƒ erori Asigurarea completฤƒ a defectelor mai mici
Suportฤƒ compatibilitate inversฤƒ. Scala nu acceptฤƒ compatibilitatea inversฤƒ.
Operatorii sunt trataศ›i diferit รฎn Java ศ™i nu sunt apeluri de metodฤƒ. Toศ›i operatorii de pe intrฤƒri sunt printr-o metodฤƒ numitฤƒ รฎn Scala.
Suportฤƒ moศ™teniri multiple folosind clase, dar nu prin clase abstracte Nu acceptฤƒ moศ™teniri multiple folosind clase, ci prin interfeศ›e
Codul este scris รฎntr-o formฤƒ compactฤƒ. Codul este scris รฎn formฤƒ lungฤƒ.
Scala nu conศ›ine cuvรขntul cheie static. Java conศ›ine cuvรขntul cheie static.

Rezumat

รŽn acest tutorial, aศ›i รฎnvฤƒศ›at cum sฤƒ รฎncepeศ›i cu Scala. Aศ›i รฎnvฤƒศ›at ศ™i caracteristicile funcศ›ionale ศ™i orientate pe obiecte. De asemenea, aศ›i descoperit asemฤƒnฤƒrile ศ™i diferenศ›ele dintre Java ศ™i Scala. Acest tutorial ar fi trebuit sฤƒ vฤƒ ajute cu o mare varietate de exemple care sunt bine demonstrate.

Rezumaศ›i aceastฤƒ postare cu: