Scala-Tutorial
Zusammenfassung des Scala-Tutorials
Dieses Scala-Tutorial behandelt alle Aspekte und Themen von Scala. Sie lernen alle Grundlagen von Grund auf, wie Was ist Scala, den Installationsprozess von Scala, Scala-Programme, Scala-Funktionen, Lazy Evaluation, Typschnittstelle, Klassen und Objekte, Vererbung, Abstraktionen, Java und Scala-Unterschiede usw.
Was ist Scala?
Scala ist eine statisch typisierte Programmiersprache, die sowohl funktionale als auch objektorientierte Programmierung umfasst, um die Skalierbarkeit von Anwendungen zu erhรถhen. Scala lรคuft hauptsรคchlich auf der JVM-Plattform und kann auch zum Schreiben von Software fรผr native Plattformen mit Scala-Native verwendet werden und JavaSkript Laufzeiten durch ScalaJs.
Scala ist eine skalierbare Sprache, die zum Schreiben von Software fรผr mehrere Plattformen verwendet wird. Daher erhielt sie den Namen โScalaโ. Diese Sprache soll die Probleme von lรถsen Java und ist gleichzeitig prรคgnanter. Ursprรผnglich von Martin Odersky entworfen, wurde es 2003 verรถffentlicht.
Warum Scala lernen?
Hier sind die Hauptgrรผnde fรผr das Erlernen der Programmiersprache Scala:
- Scala ist fรผr objektorientierte Programmierer leicht zu erlernen, Java Entwickler. Es wird in den letzten Jahren zu einer der beliebtesten Sprachen.
- Scala bietet erstklassige Funktionen fรผr Benutzer
- Scala kann ausgefรผhrt werden JVMund ebnet so den Weg fรผr die Interoperabilitรคt mit anderen Sprachen.
- Es ist fรผr Anwendungen konzipiert, die gleichzeitig, verteilt und robust nachrichtengesteuert sind. Es ist eine der anspruchsvollsten Sprachen dieses Jahrzehnts.
- Es handelt sich um eine prรคgnante, leistungsstarke Sprache, die je nach Bedarf der Benutzer schnell wachsen kann.
- Es ist objektorientiert und verfรผgt รผber viele funktionale Programmierfunktionen, die den Entwicklern viel Flexibilitรคt beim Codieren auf die von ihnen gewรผnschte Weise bieten.
- Scala bietet viele Entenarten an
- Es hat weniger Boilerplate, wenn Sie herkommen Java
- Die in Scala geschriebenen Frameworks Lift und Play befinden sich in der Wachstumskurve.
So installieren Sie Scala
Um mit dem Schreiben von Scala-Programmen beginnen zu kรถnnen, muss es auf Ihrem Computer installiert sein. Dazu mรผssen Sie deren Website besuchen https://www.scala-lang.org/download/ um die neueste Version von Scala herunterzuladen.
Wenn wir dem Link folgen, werden wir zu zwei Optionen gefรผhrt, die wir wรคhlen kรถnnen, um Scala auf unseren Maschinen zu installieren. Fรผr dieses Scala-Tutorial laden wir die IntelliJ IDEA.
Sobald Sie den Download-Link besuchen, finden Sie zwei Versionen der IntelliJ-IDE.
Fรผr dieses Scala-Tutorial laden wir die Community Edition herunter, die kostenlos ist und alles enthรคlt, was Sie zum Schreiben von Scala-Programmen benรถtigen.
Schritt 1) Community Edition auswรคhlen
Klicken Sie auf der Seite im Dropdown-Menรผ auf die Community Edition.
Es bietet uns die Mรถglichkeit, die IntelliJ IDE zusammen mit JBR herunterzuladen, die eine JDK-Implementierung enthรคlt (Java Development Kit) OpenJDK, das Scala benรถtigt, um den Code zu kompilieren und auszufรผhren.
Schritt 2) Fรผhren Sie die Installation aus
Sobald Sie IntelliJ heruntergeladen haben, doppelklicken Sie darauf, um den Installationsassistenten auszufรผhren, und folgen Sie dem Dialog.
Schritt 3) Wรคhle einen Ort
Wรคhlen Sie einen Speicherort fรผr die Installation der IDE.
Wenn Sie zufรคllig nicht die Version mit dem JDK heruntergeladen haben, erhalten wir dennoch eine Eingabeaufforderung, wo wir den Download durch Aktivieren des Kontrollkรคstchens prรผfen kรถnnen.
Schritt 4) Klicken Sie auf Weiter
Lassen Sie die anderen Standardeinstellungen unverรคndert und klicken Sie auf โWeiterโ.
Schritt 5) Klicken Sie auf das Startsymbol
Sobald die Installation abgeschlossen ist, fรผhren Sie die IntelliJ-IDE aus, indem Sie wie eine normale Anwendung auf das Startsymbol im Startmenรผ klicken.
Sie mรผssen noch einen zusรคtzlichen Schritt durchlaufen, um das Scala-Plugin zu IntelliJ hinzuzufรผgen. Klicken Sie dazu auf das Dropdown-Menรผ im Konfigurationsmenรผ unten rechts auf dem Bildschirm und wรคhlen Sie die Plugin-Option aus.
Auf der Registerkarte โMarktplatzโ wird bei einer Suche nach Scala das Plugin als erstes Ergebnis unter dem Tag โSprachenโ angezeigt.
Schritt 6) PIugin installieren
Klicken Sie auf โInstallierenโ, woraufhin das Plugin mit dem Download beginnt.
Schritt 7) Starten Sie die IDE neu
Nachdem der Download abgeschlossen ist, werden Sie aufgefordert, die IDE neu zu starten, damit das installierte Plugin mit der Arbeit beginnen kann.
Nach dem Neustart befinden Sie sich auf derselben Seite wie zuvor, als wir die IDE ausgefรผhrt haben, aber dieses Mal haben wir das Scala-Plugin bereits installiert.
Scala Hello World-Programm
Schritt 1) Wรคhlen Sie die Option โProjekt erstellenโ, um zu einer Seite zu gelangen, auf der wir die Art der Sprache auswรคhlen kรถnnen, die unser Projekt verwenden soll.
Schritt 2) Wรคhlen Sie Scala, indem Sie das Kontrollkรคstchen Scala aktivieren, und klicken Sie auf โWeiterโ.
Schritt 3) Wรคhlen Sie einen Speicherort fรผr unsere Projektdatei und geben Sie unserem Projekt einen Namen.
Wenn das Verzeichnis nicht existiert, werden wir von IntelliJ aufgefordert, um Erlaubnis zum Erstellen des Ordners zu bitten. Akzeptieren Sie und klicken Sie auf โFertig stellenโ. Sie werden zu Ihrem Scala-Projekt weitergeleitet, das derzeit keinen Scala-Code enthรคlt.
Das Laden einiger Indizes wird einige Zeit in Anspruch nehmen. Machen Sie sich also keine Sorgen, wenn Sie nicht sofort etwas tun kรถnnen, wรคhrend unten in Ihrer IDE ein Fortschrittsbalken angezeigt wird. Dies bedeutet lediglich, dass Ihre IDE einige Dateien lรคdt, die zum Ausfรผhren von Scala und erforderlich sind Hilfe bei der IDE-Autovervollstรคndigung.
Schritt 4) Als nรคchstes klicken wir auf die Registerkarte โProjekteโ links in der IDE und erweitern sie, damit wir den Inhalt unseres Projekts sehen kรถnnen.
Im Moment ist das Projekt leer und enthรคlt nur einen .idea-Ordner und eine von der IDE generierte hello-world.iml-Datei. Unser interessanter Punkt ist der Ordner src. Src ist der Ort, an dem wir den Quellcode fรผr unser Projekt speichern. Hier erstellen wir unsere erste Scala-Datei.
Schritt 5) Klicken Sie mit der rechten Maustaste auf src, um ein Menรผ zum Erstellen einer neuen Scala-Datei zu รถffnen.
Anschlieรend erstellen wir einen Namen fรผr die Datei. In diesem Scala-Tutorial verwenden wir โHalloโ und wรคhlen dann aus einem Dropdown-Menรผ aus, was als Inhalt der Scala-Datei hinzugefรผgt werden soll. Wรคhlen Sie โObjektโ
Sobald wir dies tun, verfรผgen wir รผber eine Scala-Datei mit einem Singleton-Objekt, das wir zum Ausfรผhren unseres Codes verwenden.
Jetzt haben Sie eine Scala-Datei mit einem Hello-Objekt. Sie schreiben Ihr erstes Programm, indem Sie das von Ihnen erstellte Objekt mit dem Schlรผsselwort App erweitern.
Durch die Erweiterung unseres Objekts mit App teilen Sie dem Compiler mit, welcher Code ausgefรผhrt werden soll, wenn er Ihr Programm startet. Unmittelbar nach dem Erweitern der App wird auf der linken Seite ein grรผner Pfeil angezeigt, der anzeigt, dass Sie Ihr Programm jetzt ausfรผhren kรถnnen.
Innerhalb des Hello-Objekts schreiben wir eine Funktion println(), die verwendet wird, um den darin enthaltenen Text an die Konsole zu drucken. Wir fรผhren unseren Code aus, indem wir auf den grรผnen Pfeil klicken.
Wenn wir auf den Pfeil klicken, wird uns die Option โAusfรผhrenโ angezeigt. Hallo, wenn wir darauf klicken, beginnt unser Code mit der Kompilierung und nach einigen Sekunden sehen wir die Ergebnisse unseres Programms, die von der in die IntelliJ-IDE integrierten Konsole gedruckt werden.
Und schon haben wir Scala erfolgreich installiert und unser erstes Programm ausgefรผhrt.
Was Sie mit Scala machen kรถnnen
- Frontend-Webentwicklung mit ScalaJS
- Mobile Entwicklung, beides Android Entwicklung und IOS โ mit Scala Native
- Serverseitige Bibliotheken wie HTTP4S, Akka-Http, Play Framework
- Internet der Dinge nutzen
- Spielentwicklung
- NLP โ Verarbeitung natรผrlicher Sprache unter Verwendung einer Reihe von Bibliotheken ScalaNLP
- Testen fortgeschrittener Programmiertechniken wie der funktionalen Programmierung und der objektorientierten Programmierung
- Erstellen Sie eine hochgradig gleichzeitige Kommunikationsanwendung mithilfe einer von Erlang inspirierten Bibliothek fรผr die JVM
- Verwenden Sie es fรผr maschinelles Lernen mit Bibliotheken wie Figaro, das probabilistische Programmierung durchfรผhrt, und Apache Spark zurโฏAbwicklung, Integrierung, Speicherung und
Anonyme Funktionen
Die Scala-Sprache verfรผgt รผber anonyme Funktionen, die auch aufgerufen werden Funktionsliterale. Da Scala eine funktionale Sprache ist, bedeutet dies oft, dass Entwickler groรe Probleme in viele kleine Aufgaben zerlegen und viele Funktionen erstellen, um diese Probleme zu lรถsen. Um das Erstellen von Funktionen zu vereinfachen, enthรคlt Scala die folgenden Funktionen ohne Namen instanziiert. Wir kรถnnen sie direkt den Variablen oder Definitionen โdefโ zuweisen, wie im folgenden Scala-Beispiel gezeigt:
val multiplyByTwo = (n:Int) => n * 2 def multiplyByThree = (n:Int) => n *3
Wir kรถnnen dann wie gewohnt Funktionen verwenden, indem wir ihnen folgende Parameter รผbergeben.
multiplyByTwo(3) //6 multiplyByThree(4) //12
Diese Methoden sind praktisch, wenn wir einen sauberen und prรคgnanten Code haben mรถchten. Wir kรถnnen anonyme Funktionen verwenden, wenn wir Methoden definieren, die nicht groร sind und nicht viel Code in ihrem Kรถrper erfordern. Sie sind sehr einfach und erfordern keine Zeremonie.
Diese Methoden sind nicht auf Funktionen mit Argumenten beschrรคnkt und kรถnnen zum Instanziieren von Methoden verwendet werden, die keine Argumente akzeptieren.
val sayHello = ()=>{ println("hello") }
Die meisten dieser anonymen Funktionen werden in anderen Teilen unseres Codes verwendet, wo wir vor Ort eine schnelle Funktion erstellen mรผssen.
Ein weiterer Grund, warum diese Funktionen auch als bezeichnet werden Inline-Funktionen. Die Verwendung anonymer Funktionen ist ein gรคngiges Muster, das in der Sammlungsbibliothek weit verbreitet ist, um schnelle Aktionen fรผr eine Sammlung durchzufรผhren.
Wir haben zum Beispiel die Filtermethode, die eine Inline-Funktion/anonyme Funktion verwendet, um eine weitere Sammlung mit nur Elementen zu erstellen, die die Kriterien erfรผllen, die wir in der anonymen Funktion definieren.
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)
Hier sind die Methoden, die wir als anonyme Funktionen haben, diejenigen, die prรผfen, ob der Wert, den wir aus der Liste erhalten, ungerade oder gerade ist, und das Element zurรผckgeben.
//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
In Scala ist es auch mรถglich, Platzhalter zu verwenden, wenn die Parameter unserer anonymen Funktion nicht benannt sind. Zum Beispiel
var timesTwo = (_:Int)*2 timesTwo(5) //10
In diesem Szenario benennen wir den Parameter, den wir รผbergeben, nicht. Das einzige, was wir verwenden, ist ein Unterstrich, um ihn darzustellen.
Faule Bewertung
Die meisten Sprachen werten Variablen und Funktionsparameter sequentiell nacheinander aus. In Scala gibt es ein Schlรผsselwort namens โlazyโ, das beim Umgang mit Werten hilft, die erst ausgewertet werden sollen, wenn auf sie verwiesen wird.
Eine als โLazyโ markierte Variable wird nicht an der Stelle ausgewertet, an der sie definiert ist. Dies wird allgemein als โEager-Evaluationโ bezeichnet. Sie wird nur ausgewertet, wenn spรคter im Code auf sie verwiesen wird.
Dies kann hilfreich sein, wenn die Auswertung eines Werts eine teure Berechnung sein kรถnnte. Wenn der Wert nicht immer benรถtigt wird, kรถnnen wir uns die Durchfรผhrung einer teuren Berechnung ersparen, die unsere Software verlangsamen kann, indem sie unsere Variable lazy macht.
lazy val myExpensiveValue = expensiveComputation
def runMethod()={
if(settings == true){
use(myExpensiveValue)
}else{
use(otherValue)
}
}
Dies ist nicht der einzige Anwendungsfall fรผr Lazy-Variablen. Sie helfen auch dabei, Probleme der zirkulรคren Abhรคngigkeit im Code zu lรถsen.
Falls die Einstellungen falsch sind, mรผssen wir myExpensiveValue mรถglicherweise nicht verwenden, was dazu fรผhren kann, dass wir uns eine teure Berechnung ersparen, was dazu beitrรคgt, dass Benutzer eine angenehme Zeit mit unserer Anwendung haben, da ihre anderen Bedรผrfnisse ordnungsgemรคร berechnet werden kรถnnen, ohne sie zu รผberfordern der RAM.
Wenn die Einstellungen falsch sind, mรผssen wir myExpensiveValue mรถglicherweise nicht verwenden, was dazu fรผhren kann, dass wir uns eine teure Berechnung ersparen und sicherstellen, dass Benutzer eine angenehme Zeit mit unserer Anwendung haben, da ihre anderen Anforderungen angemessen berechnet werden kรถnnen, ohne sie zu รผberfordern der RAM.
Die Faulheit hilft auch bei Funktionsargumenten, bei denen die Argumente nur verwendet werden, wenn innerhalb der Funktion auf sie verwiesen wird. Dieses Konzept wird Call-by-Name-Parameter genannt.
def sometimesUsedString(someValue:String, defaultValue:=> String)={
if(someValue != null){
use(defaultValue)
}else{
use(someValue)
}
}
Viele Sprachen verwenden die Call-by-Value-Methode zur Auswertung von Argumenten. Der durch Call-by-Name รผbergebene Parameter wird nur ausgewertet, wenn er im Funktionskรถrper benรถtigt wird, und wird vorher nicht ausgewertet. Sobald der Wert ausgewertet ist, wird er gespeichert und kann spรคter wiederverwendet werden, ohne dass er erneut ausgewertet werden muss. Ein Konzept, das als Memoisierung bekannt ist.
Typ Inferenz
In Scala mรผssen Sie nicht fรผr jede von Ihnen erstellte Variable Typen deklarieren. Dies liegt daran, dass der Scala-Compiler Typinferenzen auf Typen basierend auf der Auswertung der rechten Seite durchfรผhren kann. Dadurch wird Ihr Code prรคgnanter โ es erspart uns das Schreiben von Textbausteinen, bei denen der erwartete Typ offensichtlich ist
var first:String = "Hello, " var second:String = "World" var third = first + second //the compile infers that third is of type String
Funktion hรถherer Ordnung
Eine Funktion hรถherer Ordnung ist eine Funktion, die Funktionen als Argumente annehmen und eine Funktion als Rรผckgabetyp zurรผckgeben kann. In Scala gelten Funktionen als erstklassige Bรผrger. Wenn wir diese Funktionen auf diese Weise nutzen, kรถnnen wir bei der Art der Programme, die wir erstellen kรถnnen, sehr flexibel sein. Wir kรถnnen Funktionen dynamisch erstellen und Funktionalitรคt dynamisch in andere Funktionen einspeisen.
def doMathToInt(n:Int, myMathFunction:Int=>Int): Int ={
myMathFunction(n)
}
In der obigen Funktion รผbergeben wir ein int und eine Funktion, die ein int annimmt und ein int zurรผckgibt. Wir kรถnnen jede Funktion dieser Signatur รผbergeben. Mit Signatur meinen wir die Eingabe und Ausgabe einer Funktion. Eine Signatur von Int=>Int bedeutet, dass eine Funktion ein Int als Eingabe akzeptiert und ein Int als Ausgabe zurรผckgibt.
Eine Signatur von ()=>Int bedeutet, dass eine Funktion nichts als Eingabe akzeptiert und als Ausgabe ein Int zurรผckgibt. Ein Beispiel fรผr eine solche Funktion wรคre eine, die fรผr uns einen zufรคlligen Int generiert.
def generateRandomInt()={
return scala.util.Random.nextInt()
}
Die obige Funktion hat eine Signatur ()=>Int
Wir kรถnnen eine Funktion haben, die eine Signatur hat: scala ()=>Unit. Das bedeutet, dass die Funktionen nichts aufnehmen und keinen Typ zurรผckgeben. Die Funktion kรถnnte darin bestehen, eine Art Berechnung durchzufรผhren, indem sie etwas รคndert, um etwas Vorherbestimmtes zu tun.
Diese Art von Methoden werden jedoch nicht empfohlen, da sie eine Blackbox zu sein scheinen, die ein System auf unbekannte Weise beeinflussen kann. Sie sind auรerdem nicht testbar. Durch explizite Eingabe- und Ausgabetypen kรถnnen wir darรผber nachdenken, was unsere Funktion tut.
Eine Funktion hรถherer Ordnung kann auch eine Funktion zurรผckgeben.
Beispielsweise kรถnnten wir eine Methode erstellen, die eine Potenzfunktion erstellt, also eine Zahl nimmt und diese potenziert.
def powerByFunction(n:Int):Int=>Int = {
return (x:Int)=> scala.math.pow(x,n).toInt
}
Die obige Funktion benรถtigt einen int. Unser Rรผckgabetyp ist eine anonyme Funktion, die einen Int x akzeptiert. * Wir verwenden den Int x als Argument fรผr die Potenzfunktion.
Curry
In Scala kรถnnen wir eine Funktion, die zwei Argumente akzeptiert, in eine Funktion umwandeln, die jeweils ein Argument akzeptiert. Wenn wir ein Argument รผbergeben, wenden wir es teilweise an und erhalten am Ende eine Funktion, die ein Argument benรถtigt, um die Funktion abzuschlieรen. Mit Currying kรถnnen wir Funktionen erstellen, indem wir teilweise einige Argumente hinzufรผgen.
Dies kann nรผtzlich sein, um Funktionen dynamisch zu erstellen, bevor wir รผber einen vollstรคndigen Satz von Argumenten verfรผgen
def multiply two numbers(n:Int)(m:Int): Unit ={
return n * m
}
Wenn wir eine Funktion erstellen mรผssen, die mit einer bestimmten Zahl multipliziert, mรผssen wir keine weitere Multiplikationsmethode erstellen.
Wir kรถnnen einfach .curried fรผr unsere obige Funktion aufrufen und erhalten eine Funktion, die zuerst ein Argument akzeptiert und eine teilweise angewendete Funktion zurรผckgibt
def multiplyTwoNumbers(n:Int)(m:Int): Unit ={
return n * m
}
var multiplyByFive = multiplyTwoNumbers(5)
multiplyByFive(4)
//returns 20
Musterabgleich
Scala verfรผgt รผber einen leistungsstarken integrierten Mechanismus, der uns dabei hilft zu รผberprรผfen, ob eine Variable bestimmten Kriterien entspricht, รคhnlich wie wir es in einer Switch-Anweisung in Java oder in einer Reihe von if/else-Anweisungen. Die Sprache verfรผgt รผber Mustervergleich, mit dem wir prรผfen kรถnnen, ob eine Variable von einem bestimmten Typ ist. Mustervergleich in Scala ist leistungsstark und kann verwendet werden, um die Komponenten zu destrukturieren, die eine Unapply-Methode haben, um die Felder, an denen wir interessiert sind, direkt aus der Variable abzurufen, die wir vergleichen.
Der Mustervergleich von Scala bietet im Vergleich zur Switch-Anweisung auch eine angenehmere Syntax.
myItem match {
case true => //do something
case false => //do something else
case _ => //if none of the above do this by default
}
Wir vergleichen unsere Variable mit einer Reihe von Optionen, und wenn die Variable, die wir abgleichen, die Kriterien erfรผllt, wird der Ausdruck auf der rechten Seite des dicken Pfeils (=>) ausgewertet und als Ergebnis des Abgleichs zurรผckgegeben.
Wir verwenden einen Unterstrich, um Fรคlle abzufangen, die in unserem Code nicht รผbereinstimmen. Es spiegelt das Verhalten des Standardfalls bei der Verarbeitung von Switch-Anweisungen wider.
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
}
Im obigen Code kรถnnen Sie den Typ der Variable โmyItemโ ermitteln und auf dieser Grundlage zu einem bestimmten Code verzweigen.
Beim Mustervergleich wird geprรผft, ob die Variable รผbereinstimmt
Der Unterstrich fungiert als Platzhalter, der jede andere Bedingung erfรผllt, die nicht von den anderen Elementen in den obigen Case-Anweisungen erfรผllt wird. Wir nehmen eine Variable myItem und rufen die match-Methode auf.
- Wir รผberprรผfen, ob myItem wahr ist, indem wir auf der rechten Seite des dicken Pfeils โ=>โ etwas Logik anwenden.
- Wir verwenden den Unterstrich, um alles zu finden, was mit keiner der von uns im Code definierten Case-Anweisungen รผbereinstimmt.
Mit Case-Klassen kรถnnen wir sogar noch weiter gehen und die Klasse zerstรถren, um Felder innerhalb des Objekts zu erhalten.
Durch die Verwendung des Schlรผsselworts โsealedโ zum Definieren unserer Klassen haben wir den Vorteil, dass der Compiler die Fรคlle, mit denen wir einen Abgleich durchfรผhren mรถchten, grรผndlich prรผft und uns warnt, wenn wir vergessen, einen bestimmten Fall zu behandeln.
Unverรคnderlichkeit
Es ist mรถglich, Werte zu erstellen, die von anderen Funktionen in Scala nicht geรคndert werden kรถnnen, indem man das Schlรผsselwort val verwendet. Dies wird erreicht in Java indem wir das Schlรผsselwort final verwenden. In Scala tun wir dies, indem wir beim Erstellen einer Variablen das Schlรผsselwort val verwenden, anstatt var zu verwenden, was die Alternative ist, die wir zum Erstellen einer verรคnderbaren Variable verwenden wรผrden.
Eine mit dem Schlรผsselwort val definierte Variable ist schreibgeschรผtzt, wohingegen eine mit var definierte Variable von anderen Funktionen oder willkรผrlich vom Benutzer im Code gelesen und geรคndert werden kann.
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
Der Versuch, myNumber einen Wert zuzuweisen, nachdem wir ihn als Wert deklariert haben, lรถst einen Fehler bei der Kompilierung oder eine โNeuzuweisung zu Wertโ aus.
Warum Unverรคnderlichkeit verwenden?
Unverรคnderlichkeit hilft uns, zu verhindern, dass Code und andere Programmierer unsere Werte unerwartet รคndern, was zu unerwarteten Ergebnissen fรผhren wรผrde. Wenn sie den von uns gespeicherten Wert verwenden sollen, kรถnnen sie stattdessen eine Kopie davon erstellen. Auf diese Weise werden Fehler verhindert, die dadurch verursacht werden kรถnnen, dass mehrere Akteure dieselbe Variable รคndern.
Klassen und Objekte
Wir alle wissen, dass Objekte die Entitรคten der realen Welt sind und dass eine Klasse eine Vorlage ist, die Objekte definiert. Klassen haben sowohl Zustรคnde als auch Verhaltensweisen. Die Zustรคnde sind entweder Werte oder Variablen. Die Verhaltensweisen sind die Methoden in Scala.
Schauen wir uns an, wie Sie eine Klasse definieren, instanziieren und mit Scala verwenden kรถnnen.
Hier die Klasse namens โRechteckโ, die zwei Variablen und zwei Funktionen hat. Sie kรถnnen die Parameter l und b auch direkt als Felder im Programm verwenden. Sie haben ein Objekt, das รผber eine Hauptmethode verfรผgt und die Klasse mit zwei Werten instanziiert hat.
Ejemplo:
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)
}
}
Alle Felder und Methoden sind in Scala standardmรครig รถffentlich. Die Verwendung von Override ist unbedingt erforderlich, da die toString-Methode fรผr Object in Scala definiert ist.
Erbe
Scala verfรผgt รผber mehrere Vererbungsarten (wie einfach, mehrstufig, mehrfach, hierarchisch, hybrid), die viele Gemeinsamkeiten mit traditionellen Formen in Java. Sie kรถnnen sowohl von Klassen als auch von Merkmalen erben. Sie kรถnnen die Mitglieder einer Klasse mit dem Schlรผsselwort โextendsโ in eine andere Klasse vererben. Dies ermรถglicht die Wiederverwendbarkeit.
Es ist mรถglich, von einer oder mehreren Klassen zu erben. Es ist auch mรถglich, von Unterklassen zu erben, die selbst รผber Oberklassen verfรผgen, wodurch eine Vererbungshierarchie entsteht.
Im folgenden Scala-Beispiel ist die Basisklasse โCircleโ und die abgeleitete Klasse โSphereโ. Ein Kreis hat einen Wert namens Radius, der in der Sphere-Klasse geerbt wird. Die Methode calcArea wird mit dem Schlรผsselwort override รผberschrieben.
Ejemplo:
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
}
}
Abstraktion
In Scala kรถnnen wir mithilfe abstrakter Klassen und Merkmale abstrakte Methoden und Mitgliedsfelder erstellen. Innerhalb abstrakter Klassen und Merkmale kรถnnen wir abstrakte Felder definieren, ohne sie unbedingt zu implementieren.
Ejemplo:
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"
}
}
Diese Felder werden von den Klassen implementiert, die das Merkmal oder die abstrakte Klasse erweitern. Sie kรถnnen Merkmale verwenden, um Vertrรคge darรผber zu erstellen, was unsere Anwendung tun kann, und diese Methoden dann spรคter implementieren.
trait DatabaseService{
def addItemName(itemName:String)
def removeItem(itemId:Int)
def updateItem(itemId:Int, newItemName:String)
}
Auf diese Weise kรถnnen wir planen, wie unsere Anwendung aussehen wird, ohne Methoden zu implementieren, die uns helfen kรถnnen, uns vorzustellen, wie verschiedene Methoden aussehen werden. Es folgt einem Muster, das als Programmierung auf Abstraktionen bekannt ist, und nicht der tatsรคchlichen Implementierung.
Die Klasse, der das Schlรผsselwort abstract vorangestellt ist, kann sowohl abstrakte als auch nicht abstrakte Methoden enthalten. Mehrfachvererbungen werden in abstrakten Klassen jedoch nicht unterstรผtzt. Sie kรถnnen also hรถchstens eine abstrakte Klasse erweitern.
Singleton-Objekte
Ein Singleton ist eine Klasse, die nur einmal in einem Programm instanziiert wird. Es stammt aus einem beliebten und nรผtzlichen Programmiermuster, das als โSingleton-Musterโ bekannt ist. Dies ist nรผtzlich beim Erstellen von Instanzen, die langlebig sein sollen und auf die im gesamten Programm hรคufig zugegriffen wird und deren Status fรผr die Koordinierung der Ereignisse eines Systems von entscheidender Bedeutung ist. Das Erstellen einer solchen Klasse in Scala ist einfach, da Scala uns eine einfache Mรถglichkeit bietet, Singletons mithilfe des Schlรผsselworts object zu erstellen.
object UserProfile{
var userName=""
var isLoggedIn:Boolean = false
}
Wir kรถnnen dieses Objekt dann in unserem gesamten Programm referenzieren, mit der Garantie, dass alle Teile unseres Programms dieselben Daten sehen, da es nur eine Instanz davon gibt.
def getLoggedInStatus():Boolean={
return UserProfile.isLoggedIn
}
def changeLoggedInStatus():Boolean={
UserProfile.isLoggedIn = !UserProfile.isLoggedIn
return UserProfile.isLoggedIn
}
Das Konzept der statischen Mitglieder gibt es in Scala nicht. Aus diesem Grund mรผssen Sie Singleton-Objekte verwenden, die sich wie statische Mitglieder einer Klasse verhalten.
Implizite Klassen
Implizite Klassen sind die neuen Funktionen, die nach Version 2.1 hinzugefรผgt wurden. Sie dienen in erster Linie dazu, den geschlossenen Klassen neue Funktionen hinzuzufรผgen.
Das implizite Schlรผsselwort sollte in einer Klasse, einem Objekt oder einem Merkmal definiert werden. Der primรคre Konstruktor einer impliziten Klasse sollte genau ein Argument in seiner ersten Parameterliste haben. Es kann auch eine zusรคtzliche implizite Parameterliste enthalten.
Im folgenden Scala-Beispiel wurde eine neue Funktionalitรคt zum Ersetzen von Vokalen eines Strings durch * hinzugefรผgt.
object StringUtil {
implicit class StringEnhancer(str: String) {
def replaceVowelWithStar: String = str.replaceAll("[aeiou]", "*")
}
}
Sie mรผssen es in die Klasse importieren, in der Sie es verwenden.
import StringUtil.StringEnhancer
object ImplicitEx extends App {
val msg = "This is Guru99!"
println(msg.replaceVowelWithStar)
}
Objektorientierte Programmierung (OOP) vs. funktionale Programmierung (FP)
In der OOP werden Programme erstellt, indem Daten und die Funktionen, die auf diese Daten zugreifen, in eng miteinander verbundene Einheiten gruppiert werden. Objekte tragen ihre Daten in den Feldern und Methoden, die auf sie zugreifen. Bei diesem Programmierstil sind die Daten die Hauptabstraktion, da die erstellten Methoden dazu bestimmt sind, auf die Daten zuzugreifen.
Funktionsprogrammierungtrennt dagegen Daten und die Funktionen, die auf den Daten arbeiten. Dadurch kรถnnen Entwickler Funktionen als Abstraktion und treibende Kraft bei der Modellierung von Programmen betrachten.
Scala ermรถglicht funktionale Programmierung, indem es Funktionen als First-Class-Citizens anerkennt, sodass sie als Werte an andere Funktionen รผbergeben und auch als Werte zurรผckgegeben werden kรถnnen. Die Kombination dieser beiden Paradigmen hat Scala zu einer hervorragenden Wahl fรผr die Entwicklung komplexer Software in verschiedenen Branchen, wie beispielsweise Data Science, gemacht.
Wichtige Frameworks auf Scala
Hier sind einige wichtige Frameworks von Scala
- Spielen ist ein Open-Source-Webanwendungs-Framework, das verwendet MVC-Architektur. Es wurde 2007 verรถffentlicht und jetzt unter Apache lizenziert und wurde 2013 zum beliebtesten Framework auf GitHub. Unternehmen wie LinkedIn, Walmart, Samsung und Eero verwenden dieses Framework.
- Lift ist ein weiteres kostenloses Web-Framework, das 2007 in Scala geschrieben wurde. Foursquare verwendet das Lift-Framework. Es ist ein leistungsstarkes und schneller zu erstellendes Framework.
- Akka
- Katzen
- Spark
Parallelitรคtsunterstรผtzung
- Die Werte in Scala sind standardmรครig unverรคnderlich. Dadurch ist es sehr anpassungsfรคhig an die gleichzeitige Umgebung.
- Es gibt viele Funktionen in Scala, die es ideal fรผr gleichzeitige Anwendungen machen.
- Futures und Promises erleichtern die asynchrone Datenverarbeitung und unterstรผtzen so die Parallelitรคt.
- Akka โ Toolkit, das das Actor-Parallelitรคtsmodell verwendet. Es gibt eine Reihe von Akteuren, die handeln, wenn sie Nachrichten empfangen.
- Parallelitรคt mit Threads aus Java kann auch in Scala unterstรผtzt werden.
- Die Stream-Verarbeitung ist eine weitere groรartige Funktion, die eine kontinuierliche Datenverarbeitung in Echtzeit ermรถglicht.
Scala verfรผgt รผber einige der besten Parallelitรคtsbibliotheken der Java รkosystem.
- Ureinwohner Java Themen
- Fasern aus Bibliotheken wie Vertex
- ZIO โ eine Bibliothek mit Primitiven, die uns bei der Bewรคltigung von Parallelitรคt und asynchronen Berechnungen helfen
- STM โ Transaktion
- Zukunft โ in der Scala-Sprache integriert
Java Vergleich mit Scala
Hier sind die wichtigsten Unterschied zwischen Java und Scala.
| Scala | Java |
|---|---|
| Kompakter und prรคgnanter | Vergleichsweise grรถรere Codeblรถcke |
| Entworfen und entwickelt, um sowohl objekt- als auch funktionsorientierte Sprache zu sein. Unterstรผtzt eine Vielzahl funktionaler Programmierfunktionen wie Parallelitรคt und Unverรคnderlichkeit. |
Ursprรผnglich als objektorientierte Sprache entwickelt und unterstรผtzt seit Kurzem funktionale Programmierfunktionen. Als funktionale Programmiersprache ist sie jedoch noch nicht so stark. |
| Verwendet ein Akteurmodell zur Unterstรผtzung der modernen Parallelitรคt | Verwendet das herkรถmmliche Thread-basierte Modell fรผr Parallelitรคt. |
| Unterstรผtzt Frameworks โ Play, Lift | Unterstรผtzt Spring, Grails und vieles mehr |
| Unterstรผtzt verzรถgerte Auswertung | Unterstรผtzt keine verzรถgerte Auswertung |
| Keine statischen Mitglieder | Enthรคlt statische Mitglieder |
| Unterstรผtzt Operatorรผberladung | Unterstรผtzt keine Operatorรผberladung |
| Die Kompilierung des Quellcodes ist vergleichsweise langsam | Die Kompilierung des Quellcodes ist schneller als bei Scala |
| Eigenschaften โ benimm dich wie Java 8 Schnittstellen | Java 8 Schnittstellen versuchen, die Lรผcke zwischen Klassen und Schnittstellen zu รผberbrรผcken |
| Umschreiben ist erforderlich | Ein Umschreiben ist nicht erforderlich |
| Keine Garantie fรผr fehlerfreie Codes | Vollstรคndige Garantie fรผr kleinere Mรคngel |
| Unterstรผtzt Abwรคrtskompatibilitรคt. | Scala unterstรผtzt keine Abwรคrtskompatibilitรคt. |
| Operatoren werden unterschiedlich behandelt in Java und sind keine Methodenaufrufe. | Alle Operatoren fรผr Eintrรคge erfolgen รผber eine in Scala aufgerufene Methode. |
| Unterstรผtzt Mehrfachvererbungen mithilfe von Klassen, jedoch nicht durch abstrakte Klassen | Unterstรผtzt keine Mehrfachvererbung รผber Klassen, sondern รผber Schnittstellen |
| Code ist in kompakter Form geschrieben. | Der Code ist in Langform geschrieben. |
| Scala enthรคlt nicht das Schlรผsselwort static. | Java enthรคlt das Schlรผsselwort static. |
Zusammenfassung
In diesem Tutorial haben Sie gelernt, wie Sie mit Scala beginnen. Sie haben auch die funktionalen und objektorientierten Funktionen kennengelernt. Sie haben auch die รhnlichkeiten und Unterschiede zwischen Java und Scala. Dieses Tutorial sollte Ihnen mit einer Vielzahl gut demonstrierter Beispiele geholfen haben.






















