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.
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.
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.
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.
Pas 3) Selectaศi o locaศie
Alegeศi o locaศie pentru a instala IDE-ul.
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.
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.
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ฤ.
ร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.
ร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.
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.
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.
Pas 2) alegeศi Scala bifรขnd caseta de selectare Scala ศi faceศi clic pe urmฤtorul.
Pas 3) Selectaศi o locaศie pentru a salva fiศierul proiectelor noastre ศi daศi un nume proiectului nostru.
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.
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.
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โ
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.
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.
ร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.
ศ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.






















