Vodič za Scalu
⚡ Pametni sažetak
Scala Tutorial predstavlja statički tipizirani jezik temeljen na JVM-u koji ujedinjuje objektno orijentirano i funkcionalno programiranje. Vodič pokriva instalaciju, sintaksu, ključne značajke i okvire koji čine Scalu idealnom za izgradnju konkurentnih, skalabilnih i konciznih modernih aplikacija.

Što je Scala?
Skala je statički tipizirani programski jezik koji kombinira objektno orijentirano i funkcionalno programiranje kako bi poboljšao skalabilnost aplikacija. Scala se prvenstveno izvodi na JVM platformi, a programeri ga mogu koristiti i za pisanje softvera za nativne platforme putem Scala-Nativea ili za preglednik putem ScalaJs-a. JavaScript vrijeme izvođenja.
Scala je skalabilni jezik koji se koristi za izradu softvera za više platformi, što je upravo razlog zašto je i dobio ime. Jezik je osmišljen kako bi riješio nekoliko problema s opširnošću teksta koji se nalaze u Java a pritom ostao koncizan. Martin Odersky dizajnirao je Scalu, a prvo javno izdanje pojavilo se 2004. godine.
Zašto učiti Scalu
Evo glavnih razloga za učenje programskog jezika Scala:
- Scala je jednostavna za učenje za objektno orijentirane programere i Java programeri, a posljednjih je godina postao jedan od popularnih jezika.
- Scala nudi prvoklasne funkcije za korisnike.
- Scala se može izvršavati na JVM, otvarajući put interoperabilnosti s drugim jezicima.
- Dizajniran je za aplikacije koje su konkurentne, distribuirane i otporne, vođene porukama, što ga čini jednim od najtraženijih jezika ovog desetljeća.
- To je koncizan, moćan jezik koji može brzo rasti prema zahtjevima svojih korisnika.
- Objektno je orijentiran i uključuje mnoge značajke funkcionalnog programiranja, dajući programerima veliku fleksibilnost u načinu pisanja koda.
- Scala nudi Duck Typing kroz strukturne tipove.
- Ima manje standardnih standarda nego Java.
- Okviri Lift i Play, napisani u Scali, nastavljaju sazrijevati i rastu u popularnosti.
Kako instalirati Scala
Za početak pisanja Scala programa, morate ga imati instaliran na računalu. Da biste to učinili, posjetite službenu stranicu na https://www.scala-lang.org/download/ za preuzimanje najnovije verzije Scale.
Nakon što kliknete na poveznicu, prikazat će vam se dvije mogućnosti za instaliranje Scale. Za ovaj Scala tutorial koristit ćemo IntelliJ IDEA, što pruža izvrsnu Scala podršku odmah po instalaciji.
Nakon što posjetite poveznicu za preuzimanje, pronaći ćete dva izdanja IntelliJ IDE-a.
Za ovaj Scala tutorial, preuzet ćemo Community Edition, koji je besplatan i uključuje sve što vam je potrebno za pisanje Scala programa.
Korak 1) Odaberite Izdanje za zajednicu.
Na stranici kliknite padajući izbornik na Izdanju za zajednicu.
Nudi mogućnost preuzimanja IntelliJ IDE-a zajedno s JBR-om, koji sadrži JDK implementaciju (Java Razvojni komplet) kao što je OpenJDK koji Scala treba za kompajliranje i pokretanje koda.
Korak 2) Pokrenite instalaciju.
Nakon što preuzmete IntelliJ, dvaput kliknite instalacijski program i slijedite upute na zaslonu.
Korak 3) Odaberite lokaciju.
Odaberite mjesto za instalaciju IDE-a.
Ako niste preuzeli paket s JDK-om, instalacijski program će vas i dalje tražiti da dodate JDK putem potvrdnog okvira tijekom postavljanja.
Korak 4) Kliknite Dalje.
Ostavite ostale zadane postavke kakve jesu i kliknite Dalje.
Program Scala Hello World
Korak 5) Kliknite ikonu za pokretanje.
Nakon što je instalacija dovršena, pokrenite IntelliJ IDE klikom na njegovu ikonu za pokretanje u izborniku Start kao običnu aplikaciju.
I dalje trebate dodati Scala dodatak u IntelliJ. Kliknite padajući izbornik u izborniku za konfiguraciju u donjem desnom kutu zaslona i odaberite opciju Dodaci.
Na kartici Marketplace pretražite Scala. Dodatak se pojavljuje kao prvi rezultat pod oznakom Languages.
Korak 6) Instalirajte dodatak.
Kliknite Instaliraj za početak preuzimanja dodatka Scala.
Korak 7) Ponovno pokrenite IDE.
Nakon što preuzimanje završi, od vas će se zatražiti da ponovno pokrenete IDE kako bi instalirani dodatak mogao početi raditi.
Nakon ponovnog pokretanja, vraćate se na istu stranicu kao i prije, ali sada je Scala dodatak instaliran i spreman.
Korak 8) Odaberite Stvori projekt, što vodi do stranice na kojoj možete odabrati jezik za projekt.
Korak 9) Odaberite Scalu označavanjem potvrdnog okvira Scala i kliknite Dalje.
Korak 10) Odaberite lokaciju za spremanje datoteke projekta i dajte projektu naziv.
Ako direktorij ne postoji, IntelliJ traži dopuštenje za stvaranje mape. Prihvatite i kliknite Završi. Zatim ćete biti preusmjereni na svoj Scala projekt, koji trenutno ne sadrži nikakav Scala kod.
Učitavanje indeksa traje neko vrijeme, stoga se ne brinite ako ne možete komunicirati s IDE-om dok se na dnu prikazuje traka napretka. IDE učitava datoteke potrebne za pokretanje Scale i omogućava automatsko dovršavanje.
Korak 11) Kliknite karticu Projekt s lijeve strane IDE-a i proširite je da biste vidjeli sadržaj projekta.
U ovom trenutku, projekt je prazan i sadrži samo mapu .idea i datoteku hello-world.iml koju generira IDE. Zanimljiva je mapa src koja sadrži izvorni kod za projekt. Ovdje stvarate svoju prvu Scala datoteku.
Korak 12) Desnim klikom na src otvorite izbornik i stvorite novu Scala datoteku.
Odaberite naziv datoteke. Za ovaj Scala tutorial koristite halo, a zatim odaberite Objekt iz padajućeg izbornika za vrstu sadržaja Scala datoteke.
Nakon što to učinite, imat ćete Scala datoteku koja sadrži singleton objekt koji ćete koristiti za pokretanje koda.
Sada kada imate Scala datoteku s objektom Hello, napišite svoj prvi program proširivanjem objekta koji ste kreirali pomoću ključne riječi App.
Proširivanje objekta s App govori kompajleru koji kod treba pokrenuti prilikom pokretanja programa. Odmah nakon proširenja App, zelena strelica se pojavljuje s lijeve strane, što označava da je program sada pokrenut.
Unutar objekta Hello napišite funkciju println() za ispis teksta u konzolu. Pokrenite program klikom na zelenu strelicu.
Klikom na strelicu otvara se opcija Run Hello. Odabirom te opcije kompajlira se kod i nakon nekoliko sekundi izlaz programa pojavljuje se u IntelliJ konzoli.
Sada ste uspješno instalirali Scalu i pokrenuli svoj prvi program.
Što možete učiniti sa Scalom
Scala se široko koristi u mnogim domenama zbog svoje fleksibilnosti i JVM interoperabilnosti. Uobičajeni slučajevi upotrebe uključuju:
- Razvoj frontend weba sa ScalaJS-om.
- Razvoj mobilnih uređaja za Android i iOS sa Scala Nativeom.
- Serverske biblioteke kao što su HTTP4S, Akka-Http i Play Framework.
- Aplikacije Interneta stvari (IoT).
- Razvoj igrica.
- Obrada prirodnog jezika korištenjem ScalaNLP paketa biblioteka.
- Zajedničko vježbanje naprednih tehnika poput funkcionalnog programiranja i objektno orijentiranog programiranja.
- Visoko konkurentne komunikacijske aplikacije koje koriste aktore, biblioteku za JVM inspiriranu Erlangom.
- Strojno učenje s bibliotekama poput Figara za probabilističko programiranje i Apachea Spark za obradu podataka velikih razmjera.
Anonimne funkcije
Scala jezik podržava anonimne funkcije, također nazvane funkcijski literaliBudući da je Scala funkcionalni jezik, programeri često velike probleme razbijaju na mnogo malih zadataka i stvaraju mnogo funkcija. Kako bi to olakšali, Scala omogućuje funkcije instancirano bez imenaMožete ih izravno dodijeliti varijablama ili definicijama pomoću def, kao što je prikazano u sljedećem Scala primjeru:
val multiplyByTwo = (n:Int) => n * 2 def multiplyByThree = (n:Int) => n * 3
Zatim ih možete koristiti kao regularne funkcije prosljeđivanjem parametara:
multiplyByTwo(3) //6 multiplyByThree(4) //12
Ove metode su korisne kada želite čist i koncizan kod. Anonimne funkcije su korisne pri definiranju metoda koje su male i ne zahtijevaju puno koda u svom tijelu. Vrlo su jednostavne i ne zahtijevaju nikakvu ceremoniju za stvaranje.
Ove metode nisu ograničene na funkcije s argumentima i mogu se koristiti za instanciranje metoda koje ne primaju argumente.
val sayHello = () => { println("hello") }
Većina ovih anonimnih funkcija koristi se u drugim dijelovima koda gdje vam je potrebna brza funkcija. Zbog toga se nazivaju i ugrađene funkcijeKorištenje anonimnih funkcija uobičajeni je obrazac koji se pojavljuje u cijeloj biblioteci kolekcija za brzo izvođenje akcija nad kolekcijom.
Na primjer, metoda filtera uzima inline funkciju za stvaranje druge kolekcije samo s elementima koji zadovoljavaju kriterije definirane u anonimnoj funkciji.
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)
Ovdje anonimne funkcije provjeravaju je li vrijednost s popisa parna ili neparna i vraćaju odgovarajući 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
U Scali je također moguće koristiti zamjenske znakove tamo gdje parametar anonimne funkcije nije imenovan. Na primjer:
var timesTwo = (_:Int) * 2 timesTwo(5) //10
U ovom scenariju ne imenujete parametar. Za njegovo predstavljanje koristi se podcrta.
Lijena evaluacija
Većina jezika sekvencijalno procjenjuje varijable i parametre funkcija, jednu za drugom. U Scali, ključna riječ lazy pomaže u radu s vrijednostima koje ne želite procijeniti dok se na njih ne referencira.
Varijabla označena kao lijena ne evaluira se tamo gdje je definirana, što je obično poznato kao eager evaluacija. Evaluira se samo kada se na nju kasnije u kodu referencira.
Ovo može biti korisno kada bi procjena vrijednosti bila skup izračun. Ako vrijednost nije uvijek potrebna, štedite se od skupog izračuna koji može usporiti softver tako što varijablu čini lijenom.
lazy val myExpensiveValue = expensiveComputation def runMethod() = { if(settings == true) { use(myExpensiveValue) } else { use(otherValue) } }
Ovo nije jedini slučaj upotrebe lijenih varijabli. One također pomažu u rješavanju kružnih ovisnosti u kodu.
Ako je zastavica postavki netočna, ne morate koristiti myExpensiveValue, što vas štedi od skupog izračuna. To pomaže osigurati da korisnici imaju glatko iskustvo jer se resursi ne troše na vrijednosti koje se nikada ne čitaju.
Lijenost također pomaže s argumentima funkcije, gdje se argumenti koriste samo kada se na njih referencira unutar funkcije. Taj se koncept naziva parametri pozivanja po imenu.
def sometimesUsedString(someValue:String, defaultValue: => String) = { if(someValue != null) { use(defaultValue) } else { use(someValue) } }
Mnogi jezici koriste pristup pozivanja po vrijednosti za procjenu argumenata. Parametar proslijeđen putem pozivanja po imenu procjenjuje se samo kada je potreban unutar tijela funkcije. Nakon što se vrijednost procjeni, ona se pohranjuje i može se kasnije ponovno upotrijebiti bez ponovne procjene, koncept poznat kao memoizacija.
Tipski zaključak
U Scali ne morate deklarirati tipove za svaku varijablu koju kreirate jer Scala kompajler može zaključiti tipove s desne strane izraza. To omogućuje da vaš kod bude sažetiji i oslobađa vas pisanja standardnog koda gdje je očekivani tip očit.
var first:String = "Hello, " var second:String = "World" var third = first + second //the compiler infers that third is of type String
Funkcija višeg reda
Funkcija višeg reda je funkcija koja može primati funkcije kao argumente i vraćati funkciju kao povratni tip. U Scali se funkcije smatraju građanima prvog reda. Korištenje funkcija na ovaj način omogućuje vam veliku fleksibilnost u vrstama programa koje možete izraditi. Funkcije možete dinamički stvarati i dinamički prenositi funkcionalnosti na druge funkcije.
def doMathToInt(n:Int, myMathFunction:Int=>Int): Int = { myMathFunction(n) }
U gornjoj funkciji prosljeđujete Int i funkciju koja uzima Int i vraća IntMožete proslijediti bilo koju funkciju tog potpisa. Pod potpisom mislimo na ulaz i izlaz funkcije. Potpis Int => Int znači da funkcija uzima Int kao ulaz i vraća Int kao izlaz.
Potpis () => Int znači da funkcija ne uzima ništa kao ulaz, a vraća cijeli broj kao izlaz. Primjer takve funkcije je ona koja generira slučajni cijeli broj.
def generateRandomInt() = { return scala.util.Random.nextInt() }
Gornja funkcija ima potpis () => Int.
Funkcija također može imati potpis () => UnitTo znači da funkcija ne preuzima ništa i ne vraća tip. Funkcija umjesto toga može promijeniti neko stanje ili izvršiti unaprijed određenu radnju.
Ove vrste metoda se ne preporučuju jer mogu djelovati kao crna kutija koja utječe na sustav na nepoznate načine. Također ih je teže testirati. Eksplicitni tipovi ulaza i izlaza omogućuju vam da rasuđujete o tome što vaša funkcija radi.
Funkcija višeg reda također može vratiti funkciju. Na primjer, mogli biste stvoriti metodu koja vraća funkciju potencije, onu koja uzima broj i na njega primjenjuje potenciju.
def powerByFunction(n:Int): Int=>Int = { return (x:Int) => scala.math.pow(x,n).toInt }
Gornja funkcija prihvaća cijeli broj. Njen povratni tip je anonimna funkcija koja prihvaća cijeli broj. x i koristi ga kao argument za funkciju potencije.
Kariranje
U Scali možete pretvoriti funkciju koja prima dva argumenta u jednu koja prima jedan argument odjednom. Kada prosljeđujete jedan argument, djelomično ga primjenjujete i na kraju dobivate funkciju koja prima preostali argument za dovršetak poziva. Currying vam omogućuje izgradnju funkcija djelomičnim dodavanjem nekih argumenata.
Ovo je korisno za dinamičko stvaranje funkcija prije nego što imate potpuni skup argumenata.
def multiplyTwoNumbers(n:Int)(m:Int): Int = { return n * m }
Ako vam je potrebna funkcija koja množi određenim brojem, ne morate stvarati drugu metodu množenja. Možete primijeniti jedan argument na kariranu funkciju i ponovno upotrijebiti rezultat:
def multiplyTwoNumbers(n:Int)(m:Int): Int = { return n * m } var multiplyByFive = multiplyTwoNumbers(5) _ multiplyByFive(4) //returns 20
Usklađivanje uzoraka
Scala ima snažan ugrađeni mehanizam koji vam pomaže provjeriti odgovara li varijabla određenim kriterijima, slično kao naredba switch u Java ili lanac if/else naredbi. Jezik podržava usklađivanje uzoraka, koje možete koristiti za provjeru je li varijabla određenog tipa. Usklađivanje uzoraka u Scali je moćno i može destrukturirati komponente koje imaju unapply metoda za izravno dobivanje polja koja vas zanimaju iz varijable koja se podudara.
Scala uspoređivanje uzoraka također pruža ugodniju sintaksu od naredbe switch.
myItem match { case true => //do something case false => //do something else case _ => //if none of the above do this by default }
Varijablu uspoređujete sa skupom opcija. Kada varijabla zadovoljava kriterije, izraz s desne strane debele strelice (=>) se procjenjuje i vraća kao rezultat podudaranja.
Podcrta hvata slučajeve koji se ne podudaraju u kodu, odražavajući ponašanje zadanog slučaja u naredbi 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 _ => //unknown type, do something else }
U gornjem kodu možete otkriti vrstu myItem varijablu i, na temelju toga, granati se na određeni kod.
Uspoređivanje uzoraka provjerava odgovara li varijabla svakom slučaju redom.
Podvlaka funkcionira kao rezervirano mjesto koje odgovara bilo kojem uvjetu koji drugi case izrazi ne ispunjavaju. Uzimate varijablu myItem i nazovite match metoda.
- Provjerite je li
myItemistruei pokrenite logiku s desne strane debele strelice „=>“. - Koristite podcrtu za pronalaženje bilo čega što ne odgovara nijednoj od naredbi case definiranih u kodu.
Pomoću klasa slučajeva možete destrukturirati klasu u extract polja unutar objekta.
Upotrebom sealed ključnom riječi za definiranje klasa, dobivate prednost toga što kompajler iscrpno provjerava slučajeve koje pokušavate pronaći i upozorava vas ako zaboravite obraditi jedan.
Nepromjenljivost
Moguće je kreirati vrijednosti koje druge funkcije u Scali ne mogu mijenjati korištenjem val ključna riječ. To se postiže u Java pomoću final ključna riječ. U Scali koristite val prilikom stvaranja varijable umjesto var, što je alternativa za promjenjive varijable.
Varijabla definirana pomoću val ključna riječ je samo za čitanje, dok je ona definirana s var mogu se pročitati i kasnije mijenjati od strane drugih funkcija ili od strane korisnika u kodu.
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
Pokušava se dodijeliti vrijednost myNumber nakon što ga proglasite kao val izbacuje grešku prilikom kompajliranja: „ponovna dodjela vrijednosti“.
Zašto koristiti nepromjenjivost?
Nepromjenjivost pomaže u sprječavanju koda i drugih programera da neočekivano mijenjaju vrijednosti, što bi dovelo do nepredvidivih rezultata. Ako korisnici vrijednosti trebaju je promijeniti, umjesto toga mogu napraviti kopiju. Na taj se način sprječavaju greške uzrokovane promjenom iste varijable od strane više aktera.
Razredi i predmeti
Objekti su entiteti iz stvarnog svijeta, a klasa je predložak koji definira objekte. Klase imaju i stanje i ponašanja. Stanja su ili vrijednosti ili varijable. Ponašanja su metode u Scali.
Sljedeći odjeljak pokazuje kako definirati klasu, instancirati je i koristiti je u Scali.
Evo klase pod nazivom Rectangle koja ima dvije vrijednosti i dvije funkcije. Također možete koristiti parametre l i b izravno kao polja u programu. Imate objekt koji ima glavnu metodu i instancira klasu s dvije vrijednosti.
Primjer:
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) } }
Sva polja i metode su prema zadanim postavkama javni u Scali. Bitno je koristiti override jer toString je već definiran za svaki objekt u Scali.
Nasljeđivanje
Scala ima više vrsta nasljeđivanja (jednostruko, višerazinsko, višestruko, hijerarhijsko i hibridno) koje imaju mnogo toga zajedničkog s tradicionalnim oblicima koji se nalaze u JavaMožete nasljeđivati i iz klasa i iz osobina. Članove jedne klase nasljeđujete u drugu klasu pomoću ključne riječi extendsTo omogućuje ponovnu upotrebu.
Moguće je nasljeđivati od jedne klase ili više klasa. Također je moguće nasljeđivati od podklasa koje same imaju svoje nadklase, stvarajući pritom hijerarhiju nasljeđivanja.
U Scala primjeru ispod, osnovna klasa je Circle, a izvedena klasa je SphereKrug ima vrijednost koja se naziva radijus, a koja se nasljeđuje u klasi Sfera. Metoda calcArea poništava se ključnom riječi override.
Primjer:
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 } }
KormilartracANJE
U Scali možete kreirati trbušne mišićetract metode i polja članova pomoću abstract klase i osobine. Unutar trbušnih mišićatract klase i osobine, možete definirati abstract polja bez njihove implementacije.
Primjer:
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" } }
Ova polja implementiraju klase koje proširuju osobinu ili abstract klasa. Možete koristiti osobine za stvaranje contracts za ono što aplikacija treba raditi, a zatim kasnije implementirati te metode.
trait DatabaseService { def addItemName(itemName:String) def removeItem(itemId:Int) def updateItem(itemId:Int, newItemName:String) }
Na ovaj način možete planirati kako će aplikacija izgledati bez implementacije metoda, helpping zamišljate kako će se različite metode pojaviti. Slijedi obrazac poznat kao programiranje trbušnih mišićatraccijama, a ne samoj provedbi.
Predavanje kojem je prethodilo abstract Ključna riječ može sadržavati oba abstract i ne-abstract metode. Međutim, višestruko nasljeđivanje nije podržano u abstract klase, tako da možete istegnuti samo jedan trbušni mišićtract klasa.
Pojedinačni objekti
Singleton je klasa koja se instancira samo jednom u programu. Dolazi iz popularnog i korisnog programskog obrasca poznatog kao "singleton obrazac". Koristan je za stvaranje instanci koje su namijenjene dugotrajnom postojanju i kojima se često pristupa kroz program, gdje je stanje sastavni dio koordinacije događaja u sustavu. Stvaranje takve klase u Scali je jednostavno jer Scala pruža jednostavan način stvaranja singletona pomoću object ključne riječi.
object UserProfile { var userName = "" var isLoggedIn:Boolean = false }
Zatim možete referencirati ovaj objekt kroz cijeli program uz jamstvo da svi dijelovi programa vide iste podatke jer postoji samo jedna njegova instanca.
def getLoggedInStatus():Boolean = { return UserProfile.isLoggedIn } def changeLoggedInStatus():Boolean = { UserProfile.isLoggedIn = !UserProfile.isLoggedIn return UserProfile.isLoggedIn }
Koncept statičkih članova ne postoji u Scali, zbog čega se koriste singleton objekti koji se ponašaju kao statički članovi klase.
Implicitne klase
Implicitne klase su značajka dodana u verziji 2.10 i prvenstveno se koriste za dodavanje novih funkcionalnosti postojećim zatvorenim klasama.
The implicit Ključna riječ treba biti definirana u klasi, objektu ili svojstvu. Primarni konstruktor implicitne klase mora imati točno jedan argument u svom prvom popisu parametara. Također može uključivati dodatni implicitni popis parametara.
U Scala primjeru u nastavku dodana je nova funkcionalnost za zamjenu samoglasnika u nizu znakova *.
object StringUtil { implicit class StringEnhancer(str: String) { def replaceVowelWithStar: String = str.replaceAll("[aeiou]", "*") } }
Implicitnu klasu morate uvesti u klasu u kojoj je koristite.
import StringUtil.StringEnhancer object ImplicitEx extends App { val msg = "This is Guru99!" println(msg.replaceVowelWithStar) }
Objektno orijentirano programiranje (OOP) u odnosu na funkcionalno programiranje (FP)
U OOP-u, programi se konstruiraju grupoping podatke i funkcije koje operiraju na tim podacima u visoko povezane jedinice. Objekti nose svoje podatke u poljima, a metode operiraju na njima. U ovom stilu programiranja, glavni abstraccija su podaci, jer su stvorene metode namijenjene radu s podacima.
Funkcionalno programiranje, s druge strane, odvaja podatke i funkcije koje na njima rade. To omogućuje programerima da funkcije tretiraju kao abstraccija i pokretačka snaga pri modeliranju programa.
Scala omogućuje funkcionalno programiranje tretirajući funkcije kao građane prvog reda, omogućujući im da se prenose kao vrijednosti drugim funkcijama i vraćaju također kao vrijednosti. Kombinacija ove dvije paradigme učinila je Scalu odličnim izborom za izgradnju složenog softvera u industrijama poput znanosti o podacima.
Važni okviri na Scali
Evo nekih važnih okvira za Scalu:
- Igrati je okvir web aplikacije otvorenog koda koji koristi MVC arhitekturaObjavljen 2007. i sada licenciran pod Apacheom, postao je jedan od najpopularnijih okvira na GitHubu do 2013. Tvrtke poput LinkedIna, Walmart, Samsung i Eero koriste ovaj okvir.
- Lift je još jedan besplatni web framework napisan u Scali, pokrenut 2007. Foursquare koristi Lift framework. To je visokoučinkovit framework s kojim se brzo gradi.
- Acre pruža skup alata za izgradnju visoko konkurentnih, distribuiranih i otpornih aplikacija vođenih porukama na JVM-u.
- Mačke - Leecork je knjižnica koja pruža trbušne mišićetraccije za funkcionalno programiranje.
- Spark je objedinjeni analitički mehanizam za obradu velikih podataka, široko korišten u tijekovima rada s velikim podacima i strojnim učenjem.
Podrška za istovremenost
- Vrijednosti u Scali su nepromjenjive prema zadanim postavkama, što je čini vrlo prilagodljivom istovremenim okruženjima.
- Scala ima mnogo značajki koje je čine idealnom za istovremene aplikacije.
- Futures i Promises olakšavaju asinkronu obradu podataka, čime se podržava paralelizam.
- Akka je alat koji koristi model konkurentnosti aktera. Akteri djeluju kada prime poruke.
- Konkurentnost pomoću niti iz Java također je podržano u Scali.
- Obrada toka podataka je još jedna izvrsna značajka koja omogućuje kontinuiranu obradu podataka u stvarnom vremenu.
Scala ima neke od najboljih paralelnih biblioteka u Java ekosustav:
- Domorodac Java teme.
- Vlakna iz biblioteka poput Vertxa.
- ZIO, biblioteka koja ima primitive za pomoć pri rješavanju konkurentnosti i asinhronog računanja.
- Softverska transakcijska memorija (STM) za transakcije.
- Future, koji je ugrađen u Scala jezik.
Java protiv Scale
Evo glavnih razlike između Java i Scala.
| Skala | Java |
|---|---|
| Kompaktnije i konciznije. | Relativno veći dijelovi koda. |
| Dizajniran i razvijen da bude i objektno orijentiran i funkcionalan. Podržava širok raspon značajki funkcionalnog programiranja kao što su konkurentnost i nepromjenjivost. | Izvorno razvijen kao objektno orijentirani jezik, a u novijim verzijama počeo je podržavati značajke funkcionalnog programiranja. Još uvijek nije toliko jak kao Scala za funkcionalno programiranje. |
| Koristi model aktera za podršku konkurentnosti. | Koristi konvencionalni model temeljen na nitima za istodobnost. |
| Podržava okvire kao što su Play i Lift. | Podržava Spring, Grails i mnoge druge. |
| Podržava lijenu evaluaciju. | Izvorno ne podržava lijenu evaluaciju. |
| Nema statičnih članova. | Sadrži statičke članove. |
| Podržava preopterećenje operatora. | Ne podržava preopterećenje operatora. |
| Kompilacija izvornog koda je relativno spora. | Kompilacija izvornog koda je brža nego u Scali. |
| Osobine djeluju kao Java 8 sučelja. | Java 8 sučelja pokušava premostiti jaz između klasa i sučelja. |
| Prilikom nadogradnje verzija ponekad je potrebno ponovno pisanje. | Prepisivanje uglavnom nije potrebno između verzija. |
| Sigurnost tipova pruža snažnu pouzdanost koda, ali ne i apsolutno jamstvo odsustva grešaka. | Jaki statički elektricitetping pomaže u smanjenju mnogih nedostataka tijekom izvođenja. |
| Ima neka ograničenja unatrag kompatibilnosti među glavnim verzijama. | Snažna dugoročna unatrag kompatibilnost. |
| OperaMetode se tretiraju kao pozivi metoda. | OperaMetode su posebna sintaksa i nisu pozivi metoda. |
| Podržava višestruko nasljeđivanje korištenjem osobina. | Ne podržava višestruko nasljeđivanje pomoću klasa; umjesto toga koristi sučelja. |
| Code napisan je u kompaktnom obliku. | Code napisan je u opširnijem obliku. |
| Scala ne sadrži ključnu riječ static. | Java sadrži ključnu riječ static. |






















