Scala opetusohjelma
Scala opetusohjelman yhteenveto
Tรคmรค scala opetusohjelma kattaa kaikki scalan nรคkรถkohdat ja aiheet. Opit kaikki perusasiat tyhjรคstรค, kuten mikรค on scala, scalan asennusprosessi, Scala-ohjelmat, Scala-toiminnot, laiska arviointi, tyyppiliittymรค, luokat ja objektit, perinnรถllisyys, abstraktiot, Java ja skalaerot jne.
Mikรค on Scala?
Scala on staattisesti kirjoitettu ohjelmointikieli, joka sisรคltรครค sekรค toiminnallisen ettรค olio-ohjelmoinnin sovellusten skaalautuvuuden lisรครคmiseksi. Scala toimii ensisijaisesti JVM-alustalla, ja sitรค voidaan kรคyttรครค myรถs ohjelmistojen kirjoittamiseen alkuperรคisille alustoille kรคyttรคmรคllรค Scala-Native- ja JavaKรคsikirjoitus suoritusajat ScalaJs:n kautta.
Scala on skaalautuva kieli, jota kรคytetรครคn ohjelmistojen kirjoittamiseen useille alustoille. Tรคstรค syystรค se sai nimen "Scala". Tรคmรค kieli on tarkoitettu ratkaisemaan ongelmia Java samalla kun se on ytimekkรครคmpi. Sen alun perin suunnitteli Martin Odersky, mutta se julkaistiin vuonna 2003.
Miksi oppia Scalaa
Tรคssรค ovat tรคrkeimmรคt syyt Scala-ohjelmointikielen oppimiseen:
- Scala on helppo oppia olio-ohjelmoijille, Java kehittรคjรคt. Siitรค on tulossa yksi suosituimmista kielistรค viime vuosina.
- Scala tarjoaa kรคyttรคjille ensiluokkaisia โโtoimintoja
- Scala voidaan suorittaa JVM, mikรค tasoittaa tietรค yhteentoimivuudelle muiden kielten kanssa.
- Se on suunniteltu sovelluksille, jotka ovat samanaikaisia, hajautettuja ja joustavia sanomapohjaisia. Se on yksi tรคmรคn vuosikymmenen vaativimmista kielistรค.
- Se on ytimekรคs, tehokas kieli ja voi nopeasti kasvaa kรคyttรคjiensรค kysynnรคn mukaan.
- Se on oliosuuntautunut ja siinรค on paljon toiminnallisia ohjelmointiominaisuuksia, jotka tarjoavat kehittรคjille paljon joustavuutta koodata haluamallaan tavalla.
- Scala tarjoaa monia ankkatyyppejรค
- Siinรค on vรคhemmรคn kattilalevyรค, jos olet kotoisin Java
- Scalassa kirjoitetut Lift and Play -kehykset ovat kasvukรคyrรคssรค.
Kuinka asentaa Scala
Jotta voit aloittaa Scala-ohjelmien kirjoittamisen, sinun on oltava asennettuna tietokoneellesi. Jotta voit tehdรค tรคmรคn, sinun tulee vierailla heidรคn sivustollaan https://www.scala-lang.org/download/ ladataksesi Scalan uusimman version.
Linkin jรคlkeen meidรคt johdetaan kahteen vaihtoehtoon, jotka voimme valita Scalan asentamiseksi koneillemme. Lataamme tรคtรค Scala-opetusohjelmaa varten IntelliJ IDEA.
Kun vierailet latauslinkissรค, lรถydรคt kaksi versiota IntelliJ IDE:stรค.
Tรคtรค Scala-opetusohjelmaa varten lataamme Community Editionin, joka on ilmainen ja sisรคltรครค kaiken mitรค tarvitset Scala-ohjelmien kirjoittamiseen.
Vaihe 1) Valitse Community Edition
Napsauta sivulla Community Editionin avattavaa valikkoa.
Se tarjoaa meille mahdollisuuden ladata IntelliJ IDE yhdessรค JBR:n kanssa, joka sisรคltรครค JDK-toteutuksen (Java Development Kit) OpenJDK, jonka Scala tarvitsee kรครคntรครคkseen ja suorittaakseen koodin.
Vaihe 2) Suorita asennus
Kun olet ladannut IntelliJ:n, kaksoisnapsauta sitรค kรคynnistรครคksesi ohjatun asennustoiminnon ja seuraamalla valintaikkunaa.
Vaihe 3) Valitse sijainti
Valitse IDE:n asennuspaikka.
Jos et vahingossa ladannut sitรค JDK:n kanssa, saamme silti kehotteen, josta voimme tarkistaa sen lataamisen valitsemalla valintaruudun.
Vaihe 4) Napsauta seuraavaa
Jรคtรค muut oletusasetukset ennalleen ja napsauta Seuraava.
Vaihe 5) Napsauta kรคynnistyskuvaketta
Kun asennus on valmis, suorita IntelliJ IDE napsauttamalla sen kรคynnistyskuvaketta kรคynnistysvalikossa tavallisen sovelluksen tapaan.
Sinun on vielรค lisรคttรคvรค Scala-laajennus IntelliJ:hen. Voit tehdรค sen napsauttamalla pudotusvalikkoa konfigurointivalikossa, joka sijaitsee nรคytรถn oikeassa alakulmassa ja valitsemalla laajennusvaihtoehdon.
Marketplace-vรคlilehdellรค Scala-haku nรคyttรครค laajennuksen ensimmรคisenรค tuloksena Languages-tunnisteen alla.
Vaihe 6) Asenna laajennus
Napsauta Asenna, jolloin laajennus aloittaa latauksen.
Vaihe 7) Kรคynnistรค IDE uudelleen
Kun lataus on valmis, sinua kehotetaan kรคynnistรคmรครคn IDE uudelleen, jotta asennettu laajennus voi alkaa toimia.
Uudelleenkรคynnistyksen jรคlkeen lรถydรคt itsesi samalta sivulta kuin ennenkin, kun suoritimme IDE:tรค, mutta tรคllรค kertaa olemme jo asentaneet Scala-laajennuksen.
Scala Hello World -ohjelma
Vaihe 1) Valitse Luo projekti -vaihtoehto, joka johtaa meidรคt sivulle, jolla voimme valita kielen, jota projektimme kรคyttรครค.
Vaihe 2) valitse Scala valitsemalla Scala-valintaruutu ja napsauta Seuraava.
Vaihe 3) Valitse projektitiedoston tallennuspaikka ja anna projektille nimi.
Jos hakemistoa ei ole olemassa, IntelliJ pyytรครค meitรค kysymรครคn lupaa kansion luomiseen. Hyvรคksy ja napsauta lopeta. Sinut ohjataan Scala-projektiisi, jolla ei tรคllรค hetkellรค ole Scala-koodia.
Joidenkin indeksien lataaminen kestรครค jonkin aikaa, joten รคlรค huoli, jos et voi tehdรค heti mitรครคn, kun IDE:n alaosassa on edistymispalkki, se tarkoittaa yksinkertaisesti sitรค, ettรค IDE lataa joitain tiedostoja, joita tarvitaan Scalan ja apua IDE:n automaattiseen tรคydennykseen.
Vaihe 4) Seuraavaksi napsautamme IDE:n vasemmalla puolella olevaa projektit-vรคlilehteรค ja laajennamme, jotta voimme nรคhdรค projektimme sisรคllรถn.
Tรคllรค hetkellรค projekti on tyhjรค ja sisรคltรครค vain IDE:n luoman .idea-kansion ja hello-world.iml-tiedoston. Mielenkiintopisteemme on src-kansio. Src on paikka, johon tallennamme projektimme lรคhdekoodin. Siellรค luomme ensimmรคisen Scala-tiedostomme.
Vaihe 5) Napsauta hiiren kakkospainikkeella src avataksesi valikon uuden Scala-tiedoston luomiseksi.
Luomme sitten tiedostolle nimen, tรคssรค Scala-opetusohjelmassa kรคytรคmme helloa ja valitsemme sitten pudotusvalikosta, mitรค laitamme Scala-tiedoston sisรคllรถksi. Valitse "Objekti"
Kun teemme tรคmรคn, meillรค on Scala-tiedosto, jossa on Singleton-objekti, jota kรคytรคmme koodimme suorittamiseen.
Nyt kun sinulla on Scala-tiedosto, jossa on Hello-objekti. Kirjoitat ensimmรคisen ohjelmasi laajentamalla luomaasi objektia App-avainsanalla.
Laajennamme objektiamme sovelluksella, kerro kรครคntรคjรคlle, mikรค koodi ajetaan, kun se kรคynnistรครค ohjelman. Vรคlittรถmรคsti sovelluksen laajentamisen jรคlkeen vasemmalla puolella nรคkyy vihreรค nuoli, joka osoittaa, ettรค voit nyt suorittaa ohjelman.
Hello-objektin sisรครคn kirjoitetaan yksi funktio println(), jota kรคytetรครคn sen sisรคllรค olevan tekstin tulostamiseen konsoliin. Suoritamme koodimme napsauttamalla vihreรครค nuolta.
Napsauttamalla nuolta saamme vaihtoehdon Suorita, hei, sitรค napsauttamalla koodimme alkaa kรครคntรครค ja muutaman sekunnin kuluttua nรคemme ohjelmamme tulokset tulostettuna IntelliJ IDE:n sisรครคnrakennetusta konsolista.
Ja siinรค mennรครคn, olemme asentaneet Scalan onnistuneesti ja suorittaneet ensimmรคisen ohjelmamme.
Mitรค voit tehdรค Scalalla
- Etuliittymรคn verkkokehitys ScalaJS:llรค
- Mobiilikehitys, molemmat Android Kehitys ja IOS โ Scala Nativella
- Palvelinpuolen kirjastot, kuten HTTP4S, Akka-Http, Play Framework
- Kรคyttรคvien esineiden Internet
- Pelin kehitys
- NLP โ Natural Language Processing kรคyttรคmรคllรค ScalaNLP-kirjastoja
- Kehittyneiden ohjelmointitekniikoiden, kuten toiminnallisen ohjelmoinnin ja olioohjelmoinnin testaus
- Rakenna erittรคin samanaikainen viestintรคsovellus toimijoiden avulla Erlangin inspiroima JVM-kirjasto
- Kรคytรค sitรค koneoppimiseen kรคyttรคmรคllรค kirjastoja, kuten Figaro, joka tekee todennรคkรถisyyspohjaista ohjelmointia ja Apache Spark ettรค
Anonyymit toiminnot
Scala-kielessรค on anonyymejรค toimintoja, joita kutsutaan myรถs nimellรค funktioliteraaleja. Koska Scala on toiminnallinen kieli, kehittรคjรคt hajottavat suuret ongelmat moniin pieniin tehtรคviin ja luovat monia toimintoja nรคiden ongelmien ratkaisemiseksi. Toimintojen luomisen helpottamiseksi Scala sisรคltรครค nรคmรค toiminnot, joita voi olla muotoiltu ilman nimeรค. Voimme mรครคrittรครค ne suoraan muuttujiin tai mรครคritelmiin "def", kuten alla olevassa Scala-esimerkissรค nรคkyy:
val multiplyByTwo = (n:Int) => n * 2 def multiplyByThree = (n:Int) => n *3
Voimme sitten kรคyttรครค funktioita normaalilla tavalla siirtรคmรคllรค parametreja niille seuraavasti.
multiplyByTwo(3) //6 multiplyByThree(4) //12
Nรคmรค menetelmรคt ovat hyรถdyllisiรค, kun haluamme puhtaan ja tiiviin koodin. Voimme kรคyttรครค anonyymejรค funktioita mรครคriteltรคessรค menetelmiรค, jotka eivรคt ole suuria ja jotka eivรคt vaadi rungossaan paljon koodia. Ne ovat hyvin yksinkertaisia โโeivรคtkรค vaadi seremoniaa luodakseen.
Nรคmรค menetelmรคt eivรคt rajoitu funktioihin, joissa on argumentteja, ja niitรค voidaan kรคyttรครค sellaisten menetelmien ilmentรคmiseen, jotka eivรคt ota vastaan โโargumentteja.
val sayHello = ()=>{ println("hello") }
Useimpia nรคistรค anonyymeistรค funktioista kรคytetรครคn muissa koodimme osissa, joissa meidรคn on luotava nopea funktio.
Toinen syy, miksi nรคitรค toimintoja kutsutaan myรถs nimellรค sisรคisiรค toimintoja. Nimettรถmien funktioiden kรคyttรคminen on yleinen malli, jota kรคytetรครคn laajasti kokoelmakirjastossa suorittamaan nopeita toimintoja kokoelmalle.
Meillรค on esimerkiksi suodatusmenetelmรค, joka kรคyttรครค sisรคistรค funktiota/anonyymiรค funktiota luodakseen toisen kokoelman, jossa on vain elementtejรค, jotka tรคyttรคvรคt nimettรถmรคssรค funktiossa mรครคrittรคmรคmme kriteerit.
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)
Tรคssรค anonyymeinรค funktioina kรคyttรคmรคmme menetelmรคt ovat niitรค, jotka tarkistavat, onko luettelosta saamamme arvo pariton ja parillinen, ja palauttavat kohteen.
//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
Scalassa on myรถs mahdollista kรคyttรครค jokerimerkkejรค, joissa anonyymin funktiomme parametreja ei ole nimetty. Esimerkiksi
var timesTwo = (_:Int)*2 timesTwo(5) //10
Tรคssรค skenaariossa emme nimeรค parametria, jota vรคlitรคmme. Ainoa asia, jota kรคytรคmme alaviivaa edustamaan sitรค.
Laiska arviointi
Useimmat kielet arvioivat muuttujia ja funktioparametreja perรคkkรคin perรคkkรคin. Scalassa meillรค on avainsana nimeltรค laiska, joka auttaa kรคsittelemรครคn arvoja, joita emme halua arvioida ennen kuin niihin viitataan.
Laiskaksi merkittyรค muuttujaa ei arvioida siellรค, missรค se on mรครคritelty, eli innokas arviointi, se arvioidaan vain, kun siihen viitataan jossain myรถhemmรคssรค koodissa.
Tรคstรค voi olla apua, kun arvon arvioiminen voi olla kallista laskentaa. Jos arvoa ei aina tarvita, voimme sรครคstรครค itsemme kalliilta laskutoimituksilta, jotka voivat hidastaa ohjelmistojamme tekemรคllรค muuttujamme laiskaksi.
lazy val myExpensiveValue = expensiveComputation
def runMethod()={
if(settings == true){
use(myExpensiveValue)
}else{
use(otherValue)
}
}
Tรคmรค ei ole ainoa laiskojen muuttujien kรคyttรถtapaus. Ne auttavat myรถs kรคsittelemรครคn koodin pyรถreรคn riippuvuuden ongelmia.
Jos asetukset ovat vรครคriรค, meidรคn ei ehkรค tarvitse kรคyttรครค myExpensiveValue-arvoa, mikรค voi johtaa meidรคt sรครคstรคmรครคn kalliilta laskutoimituksilta, mikรค auttaa varmistamaan, ettรค kรคyttรคjillรค on mukavaa kรคyttรครค sovellusta, koska heidรคn muut tarpeemme voidaan laskea oikein ilman ylikuormitusta. RAM.
Jos asetukset ovat vรครคriรค, meidรคn ei ehkรค tarvitse kรคyttรครค myExpensiveValuetta, mikรค voi saada meidรคt sรครคstรคmรครคn kalliilta laskelmalta, mikรค auttaa varmistamaan, ettรค kรคyttรคjillรค on mukavaa kรคyttรครค sovellusta, koska heidรคn muut tarpeensa voidaan laskea asianmukaisesti ilman ylikuormitusta. RAM.
Laiskuus auttaa myรถs funktion argumenteissa, joissa argumentteja kรคytetรครคn vain, kun niihin viitataan funktion sisรคllรค. Tรคtรค kรคsitettรค kutsutaan nimellรค Call-by-name -parametreiksi.
def sometimesUsedString(someValue:String, defaultValue:=> String)={
if(someValue != null){
use(defaultValue)
}else{
use(someValue)
}
}
Monet kielet kรคyttรคvรคt argumenttien arviointiin arvokohtaista tapaa. Kutsutun nimen kautta vรคlitetty parametri arvioidaan vain tarvittaessa funktion rungossa, eikรค sitรค arvioida ennen sitรค. Kun arvo on arvioitu, se tallennetaan ja voidaan kรคyttรครค myรถhemmin uudelleen ilman, ettรค sitรค tarvitsee arvioida uudelleen. Kรคsite, joka tunnetaan nimellรค memoisointi.
Tyyppi johtopรครคtรถs
Scalassa sinun ei tarvitse ilmoittaa tyyppejรค jokaiselle luomillesi muuttujille. Tรคmรค johtuu siitรค, ettรค Scala-kรครคntรคjรค voi tehdรค tyyppipรครคtelmiรค tyypeistรค oikean puolen arvioinnin perusteella. Nรคin koodisi on tiiviimpi โ se vapauttaa meidรคt kirjoittamasta kattilaa, jossa odotettu tyyppi on ilmeinen
var first:String = "Hello, " var second:String = "World" var third = first + second //the compile infers that third is of type String
Korkeamman asteen toiminto
Korkeamman asteen funktio on funktio, joka voi ottaa funktioita argumentteina ja palauttaa funktion palautustyyppinรค. Scalassa toimintoja pidetรครคn ensiluokkaisina kansalaisina. Kรคyttรคmรคllรค nรคitรค toimintoja tรคllรค tavalla voimme olla erittรคin joustavia siinรค, millaisia โโohjelmia voimme tehdรค. Pystymme luomaan toimintoja dynaamisesti ja syรถttรคmรครคn toimintoja dynaamisesti muihin toimintoihin.
def doMathToInt(n:Int, myMathFunction:Int=>Int): Int ={
myMathFunction(n)
}
Yllรค olevassa funktiossa vรคlitetรครคn int ja funktio, joka ottaa int:n ja palauttaa int:n. Voimme siirtรครค minkรค tahansa allekirjoituksen toiminnon. Allekirjoituksella tarkoitamme funktion tuloa ja lรคhtรถรค. Allekirjoitus Int=>Int tarkoittaa, ettรค funktio ottaa Int:n syรถtteenรค ja palauttaa Int:n ulostulokseen.
Allekirjoitus ()=>Int tarkoittaa, ettรค funktio ei ota mitรครคn syรถtteensรค ja palauttaa Int:n tulostuksensa. Esimerkki tรคllaisesta funktiosta on sellainen, joka luo meille satunnaisen int.
def generateRandomInt()={
return scala.util.Random.nextInt()
}
Yllรค olevalla funktiolla on allekirjoitus ()=>Int
Meillรค voi olla funktio, jolla on allekirjoitus scala ()=>Yksikkรถ. Tรคmรค tarkoittaa, ettรค funktiot eivรคt ota mitรครคn vastaan โโeivรคtkรค palauta tyyppiรค. Funktio voisi tehdรค jonkinlaisen laskennan muuttamalla jotain tekemรคllรค jotain ennalta mรครคrรคttyรค.
Tรคllaisia โโmenetelmiรค ei kuitenkaan suositella, koska ne nรคyttรคvรคt olevan musta laatikko, joka voi vaikuttaa jรคrjestelmรครคn jollain tuntemattomalla tavalla. Ne ovat myรถs testaamattomia. Eksplisiittiset tulo- ja lรคhtรถtyypit antavat meille mahdollisuuden pรครคtellรค, mitรค funktiomme tekee.
Korkeamman asteen funktio voi myรถs palauttaa funktion.
Voisimme esimerkiksi luoda menetelmรคn, joka luo tehofunktion, eli ottaa luvun ja kรคyttรครค siihen tehoa.
def powerByFunction(n:Int):Int=>Int = {
return (x:Int)=> scala.math.pow(x,n).toInt
}
Yllรค oleva funktio ottaa int. Palautustyyppimme on anonyymi funktio, joka ottaa Int x:n, * kรคytรคmme int x:รครค tehofunktion argumenttina.
Curry
Scalassa voimme muuntaa kaksi argumenttia kรคyttรคvรคn funktion funktioksi, joka ottaa yhden argumentin kerrallaan. Kun vรคlitรคmme yhden argumentin, kรคytรคmme sitรค osittain ja pรครคdymme funktioon, joka vie yhden argumentin funktion suorittamiseen. Curryingin avulla voimme luoda funktioita lisรครคmรคllรค osittain joitain argumentteja.
Tรคmรค voi olla hyรถdyllistรค luotaessa funktioita dynaamisesti ennen kuin meillรค on tรคydellinen sarja argumentteja
def multiply two numbers(n:Int)(m:Int): Unit ={
return n * m
}
Jos meidรคn on luotava funktio, joka kertoo tietyllรค luvulla, meidรคn ei tarvitse luoda toista kertolaskutapaa.
Voimme yksinkertaisesti kutsua yllรค olevan funktiomme .curryed ja saada funktion, joka ottaa ensin yhden argumentin ja palauttaa osittain kรคytetyn funktion
def multiplyTwoNumbers(n:Int)(m:Int): Unit ={
return n * m
}
var multiplyByFive = multiplyTwoNumbers(5)
multiplyByFive(4)
//returns 20
Kuvion sovitus
Scalassa on tehokas sisรครคnrakennettu mekanismi, joka auttaa meitรค tarkistamaan, vastaako muuttuja tiettyjรค ehtoja, aivan kuten tekisimme kytkinlauseessa Java tai sarjassa if/else-lauseita. Kielessรค on mallisovitus, jonka avulla voimme tarkistaa, onko muuttuja tiettyรค tyyppiรค. Scalan kuvioiden tรคsmรคytys on tehokas, ja sitรค voidaan kรคyttรครค tuhoamaan komponentit, joissa on unapply-metodi, saadakseen meitรค kiinnostavat kentรคt suoraan tรคsmรครคmรคstรคmme muuttujasta.
Scalan mallinsovitus tarjoaa myรถs miellyttรคvรคmmรคn syntaksin kuin switch-lause.
myItem match {
case true => //do something
case false => //do something else
case _ => //if none of the above do this by default
}
Vertaamme muuttujaamme vaihtoehtoihin, ja kun vertailemamme muuttuja tรคyttรครค kriteerit, paksun nuolen (=>) oikealla puolella oleva lauseke arvioi ja palautetaan osuman tuloksena.
Kรคytรคmme alaviivaa havaitaksemme tapaukset, jotka ovat vertaansa vailla koodissamme. Se heijastaa oletustapauksen kรคyttรคytymistรค kytkinlauseita kรคsiteltรคessรค.
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
}
Yllรค olevasta koodista voit selvittรครค myItem-muuttujan tyypin ja haarautua sen perusteella johonkin tiettyyn koodiin.
Pattern matching tarkistaa, tรคsmรครคkรถ muuttuja
Alaviiva toimii paikkamerkkinรค, joka vastaa mitรค tahansa muuta ehtoa, jota muut yllรค olevien tapauslausekkeiden kohteet eivรคt vastaa. Otamme muuttujan myItem ja kutsumme hakumenetelmรครค.
- tarkistamme, onko myItem tosi, ja teemme logiikkaa rasvan nuolen oikealla puolella "=>".
- kรคytรคmme alaviivaa vastaamaan kaikkeen, joka ei vastaa mitรครคn koodissa mรครคrittรคmiรคmme tapauslausekkeita.
Case-luokkien avulla voimme jopa mennรค pidemmรคlle ja tuhota luokan saadaksemme kenttiรค objektin sisรครคn.
Kรคyttรคmรคllรค sinetรถityรค avainsanaa luokkiemme mรครคrittelemiseen, saamme sen hyรถdyn, ettรค kรครคntรคjรค tarkistaa perusteellisesti tapaukset, joita yritรคmme sopia, ja varoittaa meitรค, jos unohdamme kรคsitellรค tiettyรค tapausta.
muuttumattomuudesta
On mahdollista luoda arvoja, joita muut Scalan toiminnot eivรคt voi muuttaa kรคyttรคmรคllรค avainsanaa val. Tรคmรค saavutetaan vuonna Java kรคyttรคmรคllรค viimeistรค avainsanaa. Scalassa teemme sen kรคyttรคmรคllรค muuttujaa luotaessa avainsanaa val sen sijaan, ettรค kรคytรคmme var, jota kรคyttรคisimme vaihtuvan muuttujan luomiseen.
Val-avainsanalla mรครคritetty muuttuja on vain luku, kun taas muuttuja, joka on mรครคritetty var:lla, voidaan lukea ja muuttaa muilla funktioilla tai mielivaltaisesti koodissa olevan kรคyttรคjรคn toimesta.
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
Yritetรครคn mรครคrittรครค arvo myNumberille sen jรคlkeen, kun olemme ilmoittaneet sen arvoksi val, aiheuttaa kรครคnnรถsaikavirheen tai "uudelleenmรครคrityksen arvoksi".
Miksi kรคyttรครค muuttumattomuutta?
Muuttumattomuus auttaa meitรค estรคmรครคn koodia ja muita ohjelmoijia muuttamasta arvojamme odottamatta, mikรค johtaisi odottamattomiin tuloksiin, jos heidรคn on tarkoitus kรคyttรครค tallennettua arvoa, he voivat sen sijaan kopioida siitรค. Tรคllรค tavalla estetรครคn virheet, jotka voivat aiheutua siitรค, ettรค useat toimijat muuttavat samaa muuttujaa.
Luokat ja esineet
Me kaikki tiedรคmme, ettรค objektit ovat reaalimaailman kokonaisuuksia, ja luokka on malli, joka mรครคrittelee objektit. Luokilla on sekรค tila ettรค kรคyttรคytyminen. Tilat ovat joko arvoja tai muuttujia. Kรคyttรคytyminen on Scalan menetelmiรค.
Katsotaanpa, kuinka voit mรครคrittรครค luokan, luoda sen ja kรคyttรครค sitรค Scalan avulla.
Tรคssรค luokka nimeltรครคn Suorakulmio, jossa on kaksi muuttujaa ja kaksi funktiota. Voit myรถs kรคyttรครค parametreja l ja b suoraan ohjelman kenttinรค. Sinulla on objekti, jolla on pรครคmenetelmรค ja joka on instantoinut luokan kahdella arvolla.
Esimerkiksi:
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)
}
}
Kaikki kentรคt ja menetelmรค ovat oletuksena julkisia Scalassa. On vรคlttรคmรคtรถntรค kรคyttรครค ohitusta, koska toString-menetelmรค on mรครคritetty Objectille Scalassa.
Perintรถ
Scalalla on useita perintรถtyyppejรค (kuten yksi, monitasoinen, monikerroksinen, hierarkkinen, hybridi), joilla on paljon yhteistรค perinteisten muotojen kanssa. Java. Voit periรค sekรค luokista ettรค ominaisuuksista. Voit periรค yhden luokan jรคsenet toiseen luokkaan kรคyttรคmรคllรค avainsanaa "laajentuu". Tรคmรค mahdollistaa uudelleenkรคytettรคvyyden.
On mahdollista periรค yhdestรค luokasta tai useista luokista. On myรถs mahdollista periรค alaluokista, joilla itsellรครคn on yliluokat, mikรค luo prosessissa periytymishierarkian.
Alla olevassa Scala-esimerkissรค perusluokka on Ympyrรค ja johdettu luokka on Sphere. Ympyrรคllรค on arvo nimeltรค sรคde, joka periytyy Sphere-luokassa. Menetelmรค calcArea ohitetaan kรคyttรคmรคllรค avainsanan ohitusta.
Esimerkiksi:
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
}
}
Abstraktio
Scalassa voimme luoda abstrakteja menetelmiรค ja jรคsenkenttiรค kรคyttรคmรคllรค abstrakteja luokkia ja piirteitรค. Abstraktien luokkien ja piirteiden sisรคllรค voimme mรครคritellรค abstrakteja kenttiรค ilman, ettรค niitรค vรคlttรคmรคttรค toteutetaan.
Esimerkiksi:
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"
}
}
Nรคmรค kentรคt toteuttavat luokat, jotka laajentavat ominaisuutta tai abstraktia luokkaa. Ominaisuuksien avulla voit luoda sopimuksia siitรค, mitรค sovelluksemme pitรคisi pystyรค tekemรครคn, ja sitten ottaa nรคmรค menetelmรคt kรคyttรถรถn myรถhemmin.
trait DatabaseService{
def addItemName(itemName:String)
def removeItem(itemId:Int)
def updateItem(itemId:Int, newItemName:String)
}
Nรคin voimme suunnitella, miltรค sovelluksemme tulee nรคyttรคmรครคn ilman menetelmiรค, jotka voivat auttaa meitรค nรคkemรครคn, miltรค eri menetelmรคt nรคyttรคvรคt. Se seuraa ohjelmointia abstrakteihin eikรค varsinaiseen toteutukseen.
Luokka, jonka alussa on avainsana abstrakti, voi sisรคltรครค sekรค abstrakteja ettรค ei-abstrakteja menetelmiรค. Useita perintรถjรค ei kuitenkaan tueta abstraktissa luokassa. Voit siis laajentaa enintรครคn yhtรค abstraktia luokkaa.
Yksittรคisiรค esineitรค
Singleton on luokka, joka instantoidaan vain kerran ohjelmassa. Se on suositusta ja hyรถdyllisestรค ohjelmointikuviosta, joka tunnetaan nimellรค "singleton pattern". Se on hyรถdyllinen luotaessa ilmentymiรค, jotka on tarkoitettu pitkรคikรคisiksi ja joita kรคytetรครคn yleisesti koko ohjelmassa, jonka tila on olennainen jรคrjestelmรคn tapahtumien koordinoinnissa. Tรคllaisen luokan luominen Scalassa on helppoa, koska Scala tarjoaa meille yksinkertaisen tavan luoda singletoneja kรคyttรคmรคllรค objektiavainsanaa.
object UserProfile{
var userName=""
var isLoggedIn:Boolean = false
}
Voimme sitten viitata tรคhรคn objektiin koko ohjelmassamme takaamalla, ettรค kaikki ohjelmamme osat nรคkevรคt samat tiedot, koska sitรค on vain yksi esiintymรค.
def getLoggedInStatus():Boolean={
return UserProfile.isLoggedIn
}
def changeLoggedInStatus():Boolean={
UserProfile.isLoggedIn = !UserProfile.isLoggedIn
return UserProfile.isLoggedIn
}
Staattisten jรคsenten kรคsitettรค ei ole Scalassa, siksi sinun on kรคytettรคvรค singleton-objekteja, jotka toimivat kuin luokan staattiset jรคsenet.
Implisiittiset luokat
Implisiittiset luokat ovat uusia toimintoja, jotka on lisรคtty version 2.1 jรคlkeen. Sen tarkoituksena on ensisijaisesti lisรคtรค uusia toimintoja suljettuihin luokkiin.
Implisiittinen avainsana tulee mรครคritellรค luokassa, objektissa tai ominaisuudessa. Implisiittisen luokan ensisijaisella rakentajalla tulee olla tรคsmรคlleen yksi argumentti ensimmรคisessรค parametriluettelossaan. Se voi myรถs sisรคltรครค ylimรครคrรคisen implisiittisen parametriluettelon.
Alla olevassa Scala-esimerkissรค on lisรคtty uusi toiminto merkkijonon vokaalien korvaamiseksi *:lla.
object StringUtil {
implicit class StringEnhancer(str: String) {
def replaceVowelWithStar: String = str.replaceAll("[aeiou]", "*")
}
}
Sinun on tuotava luokassa, jossa kรคytรคt sitรค.
import StringUtil.StringEnhancer
object ImplicitEx extends App {
val msg = "This is Guru99!"
println(msg.replaceVowelWithStar)
}
Olio-ohjelmointi (OOP) vs. toiminnallinen ohjelmointi (FP)
OOP:ssa ohjelmat rakennetaan ryhmittelemรคllรค tiedot ja niillรค toimivat toiminnot pitkรคlle kytketyiksi yksikรถiksi. Objektit kuljettavat tietojaan niillรค toimivilla aloilla ja menetelmillรค. Tรคssรค ohjelmointityylissรค tรคrkein abstraktio on data, koska luotujen menetelmien on tarkoitus toimia datalla.
Toiminnallinen ohjelmointi, toisaalta erottaa tiedot ja datalla toimivat toiminnot. Tรคmรค antaa kehittรคjille mahdollisuuden kรคsitellรค toimintoja abstraktiona ja liikkeellepanevana voimana ohjelmia mallintaessaan.
Scala mahdollistaa toiminnallisen ohjelmoinnin, koska sillรค on funktioita ensiluokkaisina kansalaisina, jolloin ne voidaan vรคlittรครค arvoina muille funktioille ja palauttaa arvoina. Nรคiden kahden paradigman yhdistelmรค on tehnyt Scalasta erinomaisen valinnan monimutkaisten ohjelmistojen rakentamiseen eri aloilla, kuten Data Science -teollisuudessa.
Tรคrkeitรค puitteita Scalassa
Tรคssรค on joitain tรคrkeitรค Scalan puitteita
- Pelaa on avoimen lรคhdekoodin verkkosovelluskehys, joka kรคyttรครค MVC-arkkitehtuuri. Julkaistu vuonna 2007 ja nyt lisensoitu Apachella, siitรค tuli suosituin kehys GitHubissa vuonna 2013. Yritykset, kuten LinkedIn, Walmart, Samsung ja Eero, kรคyttรคvรคt tรคtรค kehystรค.
- Nostaa on toinen ilmainen verkkokehys, joka on kirjoitettu Scalassa vuonna 2007. Foursquare kรคyttรครค Lift-kehystรค. Se on tehokas, nopeampi rakentaa runko.
- Kuten
- Kissat
- Spark
Samanaikaisuuden tuki
- Scalan arvot ovat oletuksena muuttumattomia. Tรคmรค tekee siitรค erittรคin mukautuvan samanaikaiseen ympรคristรถรถn.
- Scalassa on monia ominaisuuksia, jotka tekevรคt siitรค parhaan samanaikaisiin sovelluksiin.
- Futuurit ja lupaukset helpottavat tietojen asynkronista kรคsittelyรค, mikรค tukee rinnakkaisuutta.
- Akka โ Actorin rinnakkaisuusmallia kรคyttรคvรค tyรถkalupakki. On olemassa joukko nรคyttelijรถitรค, jotka toimivat, kun he saavat viestejรค.
- Samanaikaisuus kรคyttรคmรคllรค sรคikeitรค kohteesta Java voidaan tukea myรถs Scalassa.
- Stream-kรคsittely on toinen hieno ominaisuus, joka mahdollistaa jatkuvan, reaaliaikaisen tietojenkรคsittelyn.
Scalalla on joitain parhaista samanaikaisuuskirjastoista Java ekosysteemin.
- Syntyperรคinen Java kierteet
- Kuituja kirjastoista, kuten Vertex
- ZIO โ kirjasto, jonka primitiivit auttavat meitรค kรคsittelemรครคn samanaikaisuutta ja asynkronista laskentaa
- STM โ Transaction
- Tulevaisuus โ sisรครคnrakennettu Scala-kielellรค
Java vs. Scala
Tรคssรค ovat tรคrkeimmรคt ero Java ja Scala.
| Scala | Java |
|---|---|
| Kompaktimpi ja tiiviimpi | Suhteellisen suurempia koodipaloja |
| Suunniteltu ja kehitetty sekรค objekti- ettรค toiminnalliseksi suuntautuneeksi kieleksi. Tukee laajaa valikoimaa toiminnallisia ohjelmointiominaisuuksia, kuten samanaikaisuutta, muuttumattomuutta. |
Alun perin kehitetty olio-kieleksi ja se on viime pรคivinรค alkanut tukea toiminnallisia ohjelmointiominaisuuksia. Ei silti ole vahva toiminnallisena ohjelmointikielenรค. |
| Kรคyttรครค nรคyttelijรคmallia rinnakkaisuuden tukemiseen, joka on moderni | Kรคyttรครค tavanomaista sรคiepohjaista mallia samanaikaisuuteen. |
| Tukee kehyksiรค โ Play, Lift | Tukee Spring, Grails, paljon muuta |
| Tukee laiska arviointi | Ei tue laiska arviointia |
| Ei staattisia jรคseniรค | Sisรคltรครค staattisia jรคseniรค |
| Tukee kรคyttรคjรคn ylikuormitusta | Ei tue kรคyttรคjรคn ylikuormitusta |
| Lรคhdekoodin kรครคntรคminen on suhteellisen hidasta | Lรคhdekoodin kรครคntรคminen on nopeampaa kuin Scala |
| Ominaisuudet โ toimi kuten Java 8 liitรคntรครค | Java 8 rajapintaa pyrkii kuromaan siltaa luokkien ja rajapintojen vรคlillรค |
| Uudelleenkirjoitusta tarvitaan | Uudelleenkirjoitusta ei vaadita |
| Ei varmuutta bugittomista koodeista | Tรคydellinen vakuutus pienistรค vioista |
| Tukee taaksepรคin yhteensopivuutta. | Scala ei tue taaksepรคin yhteensopivuutta. |
| Operatoreita kohdellaan eri tavalla Java eivรคtkรค ne ole menetelmรคkutsuja. | Kaikki merkintรถjen operaattorit ovat Scalassa kutsutun menetelmรคn kautta. |
| Tukee useita perintรถjรค luokkien avulla, mutta ei abstrakteja luokkia | Ei tue useita perintรถjรค luokkien avulla, vaan rajapintojen mukaan |
| Koodi on kirjoitettu kompaktissa muodossa. | Koodi kirjoitetaan pitkรคssรค muodossa. |
| Scala ei sisรคllรค staattista avainsanaa. | Java sisรคltรครค staattisen avainsanan. |
Yhteenveto
Tรคssรค opetusohjelmassa olet oppinut aloittamaan Scalan kรคytรถn. Olet myรถs oppinut toiminnalliset ja olio-ominaisuudet. Olet myรถs lรถytรคnyt yhtรคlรคisyyksiรค ja eroja Java ja Scala. Tรคmรคn opetusohjelman olisi pitรคnyt auttaa sinua monien esimerkkien kanssa, jotka ovat hyvin esiteltyjรค.






















