Scala-Tutorial

โšก Intelligente Zusammenfassung

Das Scala-Tutorial stellt eine statisch typisierte, JVM-basierte Sprache vor, die objektorientierte und funktionale Programmierung vereint. Der Leitfaden behandelt Installation, Syntax, Kernfunktionen und Frameworks, die Scala ideal fรผr die Entwicklung von nebenlรคufigen, skalierbaren und prรคgnanten modernen Anwendungen machen.

  • ๐Ÿ”˜ Hybrides Paradigma: Scala vereint objektorientierte und funktionale Programmierung auf der JVM und ermรถglicht es Entwicklern, Unverรคnderlichkeit, Funktionen erster Klasse und traditionelle Klassenhierarchien zu kombinieren.
  • โ˜‘๏ธ Prรคgnante Syntax: Typinferenz, anonyme Funktionen und Mustererkennung reduzieren den Boilerplate-Code im Vergleich zu Java wรคhrend keeping Der Code ist ausdrucksstark und gut lesbar.
  • โœ… Einrichtung mit IntelliJ: Installieren Sie die Community Edition IDE, fรผgen Sie das Scala-Plugin hinzu und erstellen Sie ein Objekt, das von App erbt, um das erste Hello World-Programm auszufรผhren.
  • ๐Ÿงช Funktionale Bausteine: Lazy Evaluation, Currying, Funktionen hรถherer Ordnung und Unverรคnderlichkeit durch val unterstรผtzen sauberen und vorhersehbaren Code.
  • ๏ธ Parallelverarbeitung und Frameworks: Akka-Schauspieler, Zukunftsplรคne, Spiel, Aufzug und Spark Das macht Scala zu einer guten Wahl fรผr verteilte Systeme, Webanwendungen und Datenverarbeitung.

Scala-Tutorial

Was ist Scala?

Scala Scala ist eine statisch typisierte Programmiersprache, die objektorientierte und funktionale Programmierung kombiniert, um die Skalierbarkeit von Anwendungen zu verbessern. Scala lรคuft primรคr auf der JVM-Plattform. Entwickler kรถnnen Scala aber auch verwenden, um Software fรผr native Plattformen mit Scala-Native oder fรผr den Browser mit ScalaJS zu entwickeln. JavaSkript Laufzeit.

Scala ist eine skalierbare Sprache, die zur Entwicklung von Software fรผr verschiedene Plattformen verwendet wird โ€“ daher auch ihr Name. Die Sprache wurde entwickelt, um einige der Probleme mit der Ausfรผhrlichkeit von Code zu lรถsen, die in anderen Sprachen auftreten. Java und dabei prรคgnant zu bleiben. Martin Odersky entwarf Scala, und die erste รถffentliche Version erschien 2004.

Warum Scala lernen?

Hier sind die wichtigsten Grรผnde, warum man die Programmiersprache Scala lernen sollte:

  • Scala ist fรผr objektorientierte Programmierer leicht zu erlernen und Java Entwickler, und es hat sich in den letzten Jahren zu einer der beliebtesten Programmiersprachen entwickelt.
  • Scala bietet erstklassige Funktionen fรผr Benutzer.
  • Scala kann auf dem JVMund ebnet so den Weg fรผr die Interoperabilitรคt mit anderen Sprachen.
  • Sie ist fรผr Anwendungen konzipiert, die nebenlรคufig, verteilt und robust nachrichtenorientiert sind, was sie zu einer der gefragtesten Sprachen dieses Jahrzehnts macht.
  • Es handelt sich um eine prรคgnante, ausdrucksstarke Sprache, die sich schnell an die Bedรผrfnisse ihrer Nutzer anpassen kann.
  • Es ist objektorientiert und beinhaltet viele funktionale Programmiermerkmale, was den Entwicklern viel Flexibilitรคt beim Schreiben des Codes bietet.
  • Scala bietet Duck Ty anping durch Strukturtypen.
  • Es enthรคlt weniger Standardtext als Java.
  • Die in Scala geschriebenen Frameworks Lift und Play reifen stetig weiter und erfreuen sich wachsender Beliebtheit.

So installieren Sie Scala

Um mit dem Schreiben von Scala-Programmen zu beginnen, muss Scala auf Ihrem Computer installiert sein. Besuchen Sie dazu die offizielle Website unter [Website-Adresse einfรผgen]. https://www.scala-lang.org/download/ Um die neueste Version von Scala herunterzuladen.

รœber den Link gelangen Sie zu zwei Installationsoptionen fรผr Scala. In diesem Scala-Tutorial verwenden wir die IntelliJ IDEA, das von Haus aus hervorragende Scala-Unterstรผtzung bietet.

So installieren Sie Scala

Nach dem Aufrufen des Download-Links finden Sie dort zwei Editionen 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.

Downloadseite der IntelliJ Community Edition

Schritt 1) Wรคhlen Sie die Community Edition.
Klicken Sie auf der Seite auf das Dropdown-Menรผ โ€žCommunity Editionโ€œ.

Es bietet die Mรถglichkeit, die IntelliJ IDE zusammen mit JBR herunterzuladen, welches eine JDK-Implementierung enthรคlt (Java Entwicklungskits) wie beispielsweise OpenJDK, die Scala zum Kompilieren und Ausfรผhren von Code benรถtigt.

IntelliJ mit JBR herunterladen

Schritt 2) Fรผhren Sie die Installation durch.
Sobald Sie IntelliJ heruntergeladen haben, doppelklicken Sie auf die Installationsdatei und folgen Sie dem Installationsassistenten auf dem Bildschirm.

IntelliJ-Installationsassistent

Schritt 3) Wรคhlen Sie einen Standort.
Wรคhlen Sie einen Speicherort fรผr die Installation der IDE.

Installationsordner auswรคhlen

Falls Sie das Bundle nicht zusammen mit dem JDK heruntergeladen haben, werden Sie vom Installationsprogramm wรคhrend der Einrichtung dennoch aufgefordert, das JDK รผber ein Kontrollkรคstchen hinzuzufรผgen.

JDK-Kontrollkรคstchen wรคhrend der Installation

Schritt 4) Weiter klicken.
Belassen Sie die รผbrigen Standardeinstellungen und klicken Sie auf Weiter.

Standardoptionen des Installationsprogramms

Scala Hello World-Programm

Schritt 5) Klicken Sie auf das Startsymbol.
Sobald die Installation abgeschlossen ist, starten Sie die IntelliJ IDE, indem Sie wie bei einer normalen Anwendung auf das entsprechende Symbol im Startmenรผ klicken.

IntelliJ-Willkommensbildschirm

Sie mรผssen das Scala-Plugin noch zu IntelliJ hinzufรผgen. Klicken Sie dazu auf das Dropdown-Menรผ im Konfigurationsmenรผ unten rechts auf dem Bildschirm und wรคhlen Sie die Option โ€žPluginsโ€œ.

Menรผ fรผr Plugins konfigurieren

IntelliJ-Plugin-Marktplatz

Suchen Sie auf der Registerkarte โ€žMarketplaceโ€œ nach Scala. Das Plugin erscheint als erstes Ergebnis unter dem Tag โ€žSprachenโ€œ.

Schritt 6) Installieren Sie das Plugin.
Klicken Sie auf โ€žInstallierenโ€œ, um den Download des Scala-Plugins zu starten.

Scala-Plugin installieren

Schritt 7) Starten Sie die IDE neu.
Nach Abschluss des Downloads werden Sie aufgefordert, die IDE neu zu starten, damit das installierte Plugin funktionsbereit ist.

IntelliJ neu starten

Nach dem Neustart gelangen Sie wieder auf dieselbe Seite wie zuvor, aber jetzt ist das Scala-Plugin installiert und einsatzbereit.

Schritt 8) Wรคhlen Sie โ€žProjekt erstellenโ€œ. Daraufhin gelangen Sie zu einer Seite, auf der Sie die Sprache fรผr das Projekt auswรคhlen kรถnnen.

Neues Projekt in IntelliJ erstellen

Schritt 9) Wรคhlen Sie Scala aus, indem Sie das Kontrollkรคstchen โ€žScalaโ€œ aktivieren und auf โ€žWeiterโ€œ klicken.

Scala-Sprache auswรคhlen

Schritt 10) Wรคhlen Sie einen Speicherort fรผr die Projektdatei und geben Sie dem Projekt einen Namen.

Projekt benennen und lokalisieren

Falls das Verzeichnis nicht existiert, fragt IntelliJ nach der Berechtigung zum Erstellen des Ordners. Bestรคtigen Sie die Anfrage und klicken Sie auf โ€žFertigstellenโ€œ. AnschlieรŸend gelangen Sie zu Ihrem Scala-Projekt, das derzeit noch keinen Scala-Code enthรคlt.

Das Laden der Indizes kann einige Zeit dauern. Machen Sie sich daher keine Sorgen, wenn Sie wรคhrend der Anzeige des Fortschrittsbalkens am unteren Rand nicht mit der IDE interagieren kรถnnen. Die IDE lรคdt die fรผr die Ausfรผhrung von Scala und die Autovervollstรคndigung erforderlichen Dateien.

Schritt 11) Klicken Sie auf der linken Seite der IDE auf die Registerkarte โ€žProjektโ€œ und erweitern Sie diese, um den Inhalt des Projekts anzuzeigen.

Registerkarte โ€žProjektโ€œ erweitern

Das Projekt ist zu diesem Zeitpunkt leer und enthรคlt lediglich einen .idea-Ordner und eine vom IDE generierte hello-world.iml-Datei. Von Interesse ist der src-Ordner, der den Quellcode des Projekts enthรคlt. Hier erstellen Sie Ihre erste Scala-Datei.

Schritt 12) Klicken Sie mit der rechten Maustaste auf src, um ein Menรผ zu รถffnen und eine neue Scala-Datei zu erstellen.

Erstellen Sie eine neue Scala-Datei

Wรคhlen Sie einen Namen fรผr die Datei. Verwenden Sie fรผr dieses Scala-Tutorial HALLOWรคhlen Sie anschlieรŸend im Dropdown-Menรผ fรผr den Inhaltstyp der Scala-Datei die Option โ€žObjektโ€œ aus.

Objektart auswรคhlen

Sobald Sie dies getan haben, verfรผgen Sie รผber eine Scala-Datei, die ein Singleton-Objekt enthรคlt, mit dem Sie den Code ausfรผhren kรถnnen.

Singleton-Objekt erstellt

Nachdem Sie nun eine Scala-Datei mit einem Hello-Objekt haben, schreiben Sie Ihr erstes Programm, indem Sie das erstellte Objekt mit dem Schlรผsselwort App erweitern.

Durch die Erweiterung des Objekts mit `App` wird dem Compiler mitgeteilt, welcher Code beim Programmstart ausgefรผhrt werden soll. Unmittelbar nach der Erweiterung von `App` erscheint links ein grรผner Pfeil, der anzeigt, dass das Programm nun ausfรผhrbar ist.

Pfeil in IntelliJ ausfรผhren

Option "Hallo ausfรผhren"

Schreiben Sie innerhalb des Hello-Objekts die Funktion println(), um den Text auf der Konsole auszugeben. Starten Sie das Programm durch Klicken auf den grรผnen Pfeil.

Durch Klicken auf den Pfeil wird die Option โ€žHello ausfรผhrenโ€œ angezeigt. Durch Auswahl dieser Option wird der Code kompiliert, und nach einigen Sekunden erscheint die Programmausgabe in der IntelliJ-Konsole.

โ€žHello Worldโ€œ-Ausgabe in der Konsole

Sie haben Scala nun erfolgreich installiert und kรถnnen Ihr erstes Programm ausfรผhren.

Was Sie mit Scala machen kรถnnen

Scala ist aufgrund seiner Flexibilitรคt und JVM-Interoperabilitรคt in vielen Bereichen weit verbreitet. Typische Anwendungsfรคlle sind:

  • Frontend-Webentwicklung mit ScalaJS.
  • Mobile-Entwicklung fรผr Android und iOS mit Scala Native.
  • Serverseitige Bibliotheken wie HTTP4S, Akka-Http und das Play Framework.
  • Anwendungen des Internets der Dinge (IoT).
  • Spieleentwicklung.
  • Verarbeitung natรผrlicher Sprache mithilfe der ScalaNLP-Bibliothekssuite.
  • Fortgeschrittene Techniken wie funktionale Programmierung und objektorientierte Programmierung gemeinsam รผben.
  • Hochgradig parallele Kommunikationsanwendungen mit Aktoren, eine von Erlang inspirierte Bibliothek fรผr die JVM.
  • Maschinelles Lernen mit Bibliotheken wie Figaro fรผr probabilistische Programmierung und Apache Spark fรผr die Verarbeitung groรŸer Datenmengen.

Anonyme Funktionen

Die Programmiersprache Scala unterstรผtzt anonyme Funktionen, auch anonyme Funktionen genannt. FunktionsliteraleDa Scala eine funktionale Sprache ist, zerlegen Entwickler groรŸe Probleme oft in viele kleine Aufgaben und erstellen viele Funktionen. Um dies zu vereinfachen, ermรถglicht Scala die Verwendung von Funktionen. ohne Namen instanziiertSie kรถnnen sie direkt Variablen oder Definitionen zuweisen, indem Sie def, wie das folgende Scala-Beispiel zeigt:

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

Sie kรถnnen sie dann wie regulรคre Funktionen verwenden, indem Sie Parameter รผbergeben:

multiplyByTwo(3)
//6

multiplyByThree(4)
//12

Diese Methoden sind praktisch, wenn man sauberen und prรคgnanten Code schreiben mรถchte. Anonyme Funktionen eignen sich gut, um kurze Methoden zu definieren, die wenig Code im Funktionskรถrper benรถtigen. Sie sind sehr einfach und lassen sich unkompliziert erstellen.

Diese Methoden sind nicht auf Funktionen mit Argumenten beschrรคnkt und kรถnnen auch zur Instanziierung von Methoden verwendet werden, die keine Argumente benรถtigen.

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

Die meisten dieser anonymen Funktionen werden in anderen Teilen des Codes verwendet, wo man schnell eine passende Funktion benรถtigt. Aus diesem Grund werden sie auch als anonyme Funktionen bezeichnet. Inline-FunktionenDie Verwendung anonymer Funktionen ist ein gรคngiges Muster, das in der gesamten Collections-Bibliothek vorkommt, um schnelle Aktionen auf einer Collection durchzufรผhren.

Die Filtermethode verwendet beispielsweise eine Inline-Funktion, um eine weitere Sammlung zu erstellen, die nur die Elemente enthรคlt, die den in der anonymen Funktion definierten Kriterien entsprechen.

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 prรผfen die anonymen Funktionen, ob der Wert aus der Liste gerade oder ungerade ist, und geben das entsprechende Element zurรผck.

//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, Wildcards zu verwenden, wenn der anonyme Funktionsparameter keinen Namen hat. Zum Beispiel:

var timesTwo = (_:Int) * 2

timesTwo(5)
//10

In diesem Fall wird der Parameter nicht benannt. Er wird durch einen Unterstrich dargestellt.

Faule Bewertung

Die meisten Sprachen werten Variablen und Funktionsparameter nacheinander aus. In Scala ist das Schlรผsselwort lazy Hilft dabei, mit Werten umzugehen, die man erst dann bewerten mรถchte, wenn sie explizit erwรคhnt werden.

Eine als โ€žlazyโ€œ gekennzeichnete Variable wird nicht bei ihrer Definition ausgewertet; dies wird gemeinhin als โ€žeager Evaluationโ€œ bezeichnet. Sie wird erst ausgewertet, wenn spรคter im Code auf sie zugegriffen wird.

Dies kann hilfreich sein, wenn die Auswertung eines Wertes eine aufwรคndige Berechnung erfordern wรผrde. Wird der Wert nicht immer benรถtigt, erspart man sich eine rechenintensive und die Software verlangsamende Berechnung, indem man die Variable verzรถgert auswertet.

lazy val myExpensiveValue = expensiveComputation

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

Dies ist nicht der einzige Anwendungsfall fรผr Lazy Variables. Sie helfen auch beim Umgang mit zirkulรคren Abhรคngigkeiten im Code.

Wenn die entsprechende Einstellung deaktiviert ist, benรถtigen Sie โ€žmyExpensiveValueโ€œ nicht, wodurch eine aufwรคndige Berechnung vermieden wird. Dies trรคgt zu einer reibungslosen Benutzererfahrung bei, da keine Ressourcen fรผr Werte verschwendet werden, die nie verwendet werden.

Faulheit hilft auch bei Funktionsargumenten, da diese nur dann verwendet werden, wenn innerhalb der Funktion auf sie zugegriffen wird. Dieses Konzept wird als Namensaufruf bezeichnet.

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

Viele Programmiersprachen verwenden die Wertรผbergabe zur Auswertung von Argumenten. Ein Parameter, der per Namensรผbergabe รผbergeben wird, wird nur dann innerhalb des Funktionskรถrpers ausgewertet, wenn dies erforderlich ist. Sobald der Wert ausgewertet wurde, wird er gespeichert und kann spรคter ohne erneute Auswertung wiederverwendet werden โ€“ ein Konzept, das als Memoisation bekannt ist.

Typ Inferenz

In Scala mรผssen Sie nicht fรผr jede Variable einen Typ deklarieren, da der Scala-Compiler den Typ aus der rechten Seite eines Ausdrucks ableiten kann. Dadurch wird Ihr Code prรคgnanter und Sie vermeiden unnรถtigen Code, wenn der erwartete Typ offensichtlich ist.

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

Funktion hรถherer Ordnung

Eine Funktion hรถherer Ordnung ist eine Funktion, die Funktionen als Argumente entgegennehmen und eine Funktion als Rรผckgabetyp zurรผckgeben kann. In Scala werden Funktionen als erstklassige Objekte betrachtet. Durch die Verwendung von Funktionen auf diese Weise kรถnnen Sie sehr flexibel verschiedene Arten von Programmen erstellen. Sie kรถnnen Funktionen dynamisch erstellen und anderen Funktionen dynamisch Funktionalitรคt zuweisen.

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

In der obigen Funktion รผbergeben Sie einen Int und eine Funktion, die eine Int und gibt ein zurรผck IntSie kรถnnen jede Funktion mit dieser Signatur รผbergeben. Mit Signatur meinen wir die Eingabe und Ausgabe einer Funktion. Eine Signatur von Int => Int bedeutet, dass eine Funktion einen Int-Wert als Eingabe nimmt und einen Int-Wert als Ausgabe zurรผckgibt.

Eine Unterschrift von () => Int Das bedeutet, dass eine Funktion keine Eingabe benรถtigt und einen Integer-Wert als Ausgabe zurรผckgibt. Ein Beispiel fรผr eine solche Funktion ist eine, die einen zufรคlligen Integer-Wert generiert.

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

Die obige Funktion hat eine Signatur () => Int.

Eine Funktion kann auch eine Signatur haben. () => UnitDas bedeutet, dass die Funktion keine Parameter entgegennimmt und keinen Typ zurรผckgibt. Stattdessen kann die Funktion einen Zustand รคndern oder eine vorbestimmte Aktion ausfรผhren.

Solche Methoden sind nicht empfehlenswert, da sie wie eine Blackbox wirken und ein System auf unbekannte Weise beeinflussen kรถnnen. AuรŸerdem sind sie schwieriger zu testen. Die explizite Angabe von Eingabe- und Ausgabetypen ermรถglicht es, die Funktionsweise der jeweiligen Funktion nachzuvollziehen.

Eine Funktion hรถherer Ordnung kann ebenfalls eine Funktion zurรผckgeben. Beispielsweise kรถnnte man eine Methode erstellen, die eine Potenzierungsfunktion zurรผckgibt, also eine Funktion, die eine Zahl entgegennimmt und sie potenziert.

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

Die obige Funktion erwartet einen Integer-Wert. Ihr Rรผckgabetyp ist eine anonyme Funktion, die einen Integer-Wert erwartet. x und verwendet es als Argument fรผr die Potenzfunktion.

Curry

In Scala kann man eine Funktion, die zwei Argumente erwartet, in eine Funktion umwandeln, die jeweils nur ein Argument entgegennimmt. Beim รœbergeben eines Arguments wird dieses teilweise angewendet, und die Funktion erhรคlt das verbleibende Argument, um den Aufruf abzuschlieรŸen. Currying ermรถglicht es, Funktionen durch das schrittweise Hinzufรผgen einzelner Argumente zu erstellen.

Dies ist nรผtzlich, um Funktionen dynamisch zu erstellen, bevor man รผber einen vollstรคndigen Satz von Argumenten verfรผgt.

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

Wenn Sie eine Funktion benรถtigen, die mit einer bestimmten Zahl multipliziert, mรผssen Sie keine weitere Multiplikationsmethode erstellen. Sie kรถnnen ein Argument an die Curried-Funktion รผbergeben und das Ergebnis wiederverwenden:

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

var multiplyByFive = multiplyTwoNumbers(5) _

multiplyByFive(4)

//returns 20

Musterabgleich

Scala verfรผgt รผber einen leistungsstarken, integrierten Mechanismus, mit dem Sie รผberprรผfen kรถnnen, ob eine Variable bestimmte Kriterien erfรผllt, รคhnlich wie eine Switch-Anweisung in โ€ฆ Java oder eine Kette von if/else-Anweisungen. Die Sprache unterstรผtzt Pattern Matching, mit dem Sie รผberprรผfen kรถnnen, ob eine Variable einen bestimmten Typ hat. Pattern Matching in Scala ist leistungsstark und kann Komponenten dekonstruieren, die ein unapply Methode, um die gewรผnschten Felder direkt aus der รผbereinstimmenden Variable zu erhalten.

Scala Pattern Matching bietet zudem eine angenehmere Syntax als eine Switch-Anweisung.

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

Sie vergleichen die Variable mit einer Reihe von Optionen. Wenn die Variable die Kriterien erfรผllt, wird der Ausdruck rechts vom Pfeil (=>) ausgewertet und als Ergebnis der รœbereinstimmung zurรผckgegeben.

Der Unterstrich kennzeichnet Fรคlle, die im Code nicht abgedeckt werden, und spiegelt damit das Verhalten des Standardfalls in einer Switch-Anweisung 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 _ => //unknown type, do something else
}

Im obigen Code kรถnnen Sie den Typ des myItem Variable und, basierend darauf, Verzweigung zu spezifischem Code.

Beim Mustervergleich wird der Reihe nach geprรผft, ob die Variable mit jedem Fall รผbereinstimmt.

Der Unterstrich dient als Platzhalter, der auf jede Bedingung zutrifft, die von den anderen Fallunterscheidungen nicht abgedeckt wird. Sie nehmen eine Variable. myItem und rufen Sie die match Methode.

  • Prรผfe ob myItem is true und fรผhre die Logik auf der rechten Seite des fetten Pfeils โ€ž=>โ€œ aus.
  • Verwenden Sie den Unterstrich, um alles zu kennzeichnen, was keiner der im Code definierten Fallunterscheidungen entspricht.

Mit Case-Klassen kรถnnen Sie die Klasse destrukturieren, um beispielsweise โ€ฆtract Felder innerhalb des Objekts.

Durch die Verwendung der sealed Wenn Sie ein Schlรผsselwort zur Definition von Klassen verwenden, profitieren Sie davon, dass der Compiler alle Fรคlle, die Sie abgleichen mรถchten, vollstรคndig รผberprรผft und Sie warnt, falls Sie einen Fall vergessen haben.

Unverรคnderlichkeit

Es ist in Scala mรถglich, Werte zu erzeugen, die von anderen Funktionen nicht geรคndert werden kรถnnen, indem man die val Schlรผsselwort. Dies wird erreicht durch Java mit dem final Schlรผsselwort. In Scala verwendet man ein val beim Erstellen einer Variablen anstatt var, was die Alternative fรผr verรคnderliche Variablen darstellt.

Eine Variable, die mithilfe der val Das Schlรผsselwort ist schreibgeschรผtzt, wohingegen ein mit var kann spรคter von anderen Funktionen oder vom Benutzer im Code gelesen und geรคndert werden.

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

Ich versuche, einen Wert zuzuweisen myNumber nachdem es als ein val wirft einen Kompilierfehler: โ€žNeuzuweisung an valโ€œ.

Warum Unverรคnderlichkeit verwenden?

Unverรคnderlichkeit verhindert, dass Code und andere Programmierer Werte unerwartet รคndern, was zu unvorhersehbaren Ergebnissen fรผhren wรผrde. Wenn Nutzer eines Wertes diesen รคndern mรผssen, kรถnnen sie stattdessen eine Kopie erstellen. Dadurch werden Fehler vermieden, die entstehen, wenn mehrere Akteure dieselbe Variable รคndern.

Klassen und Objekte

Objekte sind Entitรคten der realen Welt, und eine Klasse ist eine Vorlage, die Objekte definiert. Klassen besitzen sowohl einen Zustand als auch ein Verhalten. Die Zustรคnde sind entweder Werte oder Variablen. Das Verhalten sind die Methoden in Scala.

Im nรคchsten Abschnitt wird gezeigt, wie man eine Klasse definiert, sie instanziiert und in Scala verwendet.

Hier ist eine Klasse namens Rechteck, die zwei Werte und zwei Funktionen besitzt. Sie kรถnnen auch die Parameter verwenden. l und b direkt als Felder im Programm. Sie haben ein Objekt, das eine main-Methode besitzt und die Klasse mit zwei Werten instanziiert.

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

In Scala sind alle Felder und Methoden standardmรครŸig รถffentlich. Es ist unerlรคsslich, sie zu verwenden. override weil toString ist bereits fรผr jedes Objekt in Scala definiert.

Erbe

Scala verfรผgt รผber verschiedene Vererbungsarten (einfach, mehrstufig, mehrfach, hierarchisch und hybrid), die viele Gemeinsamkeiten mit traditionellen Formen aufweisen, die in โ€ฆ zu finden sind. JavaSie kรถnnen sowohl von Klassen als auch von Traits erben. Die Mitglieder einer Klasse werden mithilfe des Schlรผsselworts `property` in eine andere Klasse vererbt. extendsDies ermรถglicht die Wiederverwendbarkeit.

Es ist mรถglich, von einer oder mehreren Klassen zu erben. Ebenso ist es mรถglich, von Unterklassen zu erben, die selbst Oberklassen besitzen, wodurch eine Vererbungshierarchie entsteht.

Im folgenden Scala-Beispiel ist die Basisklasse Circleund die abgeleitete Klasse ist SphereEin Kreis besitzt einen Wert namens Radius, der von der Klasse Sphere geerbt wird. Die Methode calcArea wird durch das Schlรผsselwort รผberschrieben override.

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

AbstracProduktion

In Scala kรถnnen Sie Abs erstellentract-Methoden und Mitgliedsfelder unter Verwendung von abstracT-Klassen und Merkmale. Innerhalb der Bauchmuskelntract-Klassen und -Merkmale, Sie kรถnnen absolute definierentract-Felder, ohne sie 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 Trait oder abs erweitern.tract-Klasse. Sie kรถnnen Traits verwenden, um Verbindungen herzustellen.tracts fรผr das, was eine Anwendung tun soll, und implementieren Sie diese Methoden dann spรคter.

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

Auf diese Weise kรถnnen Sie planen, wie eine Anwendung aussehen soll, ohne die Methoden implementieren zu mรผssen.ping Man stellt sich vor, wie verschiedene Methoden aussehen werden. Es folgt einem Muster, das als Programmierung bekannt ist, um zu verstehen, wie man es umsetzt.traceher auf die Umsetzung als auf die tatsรคchliche Umsetzung.

Eine Klasse, die mit dem/der/dem eingeleitet wird abstract Das Schlรผsselwort kann beides enthalten: Abs.tract und Nicht-Abstract-Methoden. Mehrfachvererbung wird in abs jedoch nicht unterstรผtzt.tract-Klassen, sodass Sie nur einen Abs erweitern kรถnnentract-Klasse.

Singleton-Objekte

Ein Singleton ist eine Klasse, die in einem Programm nur einmal instanziiert wird. Es stammt aus einem bekannten und nรผtzlichen Programmiermuster, dem โ€žSingleton-Musterโ€œ. Es eignet sich fรผr die Erstellung von Instanzen, die langlebig sein und im gesamten Programm hรคufig verwendet werden sollen, da ihr Zustand fรผr die Koordination von Ereignissen im System unerlรคsslich ist. In Scala ist die Erstellung einer solchen Klasse einfach, da Scala eine unkomplizierte Mรถglichkeit zur Erzeugung von Singletons bietet. object Stichwort.

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

Sie kรถnnen dann im gesamten Programm auf dieses Objekt verweisen und sich darauf verlassen, dass alle Teile des Programms die gleichen 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 statischer Member existiert in Scala nicht. Deshalb verwendet man Singleton-Objekte, die sich wie statische Member einer Klasse verhalten.

Implizite Klassen

Implizite Klassen sind ein Feature, das in Version 2.10 hinzugefรผgt wurde und hauptsรคchlich dazu dient, bestehenden geschlossenen Klassen neue Funktionalitรคt hinzuzufรผgen.

Das implicit Das Schlรผsselwort muss in einer Klasse, einem Objekt oder einem Trait definiert sein. Der primรคre Konstruktor einer impliziten Klasse muss genau ein Argument in seiner ersten Parameterliste haben. Er kann auch eine zusรคtzliche implizite Parameterliste enthalten.

Im folgenden Scala-Beispiel wird eine neue Funktionalitรคt hinzugefรผgt, um Vokale eines Strings durch * zu ersetzen.

object StringUtil {
  implicit class StringEnhancer(str: String) {

    def replaceVowelWithStar: String = str.replaceAll("[aeiou]", "*")
  }
}

Sie mรผssen die implizite Klasse in der Klasse importieren, in der Sie sie 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 objektorientierten Programmierung (OOP) werden Programme durch Gruppenbildung erstellt.ping Daten und die Funktionen, die auf diesen Daten operieren, werden zu eng miteinander verbundenen Einheiten zusammengefasst. Objekte speichern ihre Daten in Feldern, und die Methoden operieren auf diesen Feldern. In diesem Programmierstil ist die HauptabstraktiontracDie Daten sind entscheidend, denn die erstellten Methoden sind dazu bestimmt, auf den Daten zu operieren.

FunktionsprogrammierungAndererseits trennt es Daten und die Funktionen, die darauf operieren. Dies ermรถglicht es Entwicklern, Funktionen als absolute Datenstrukturen zu behandeln.traction und treibende Kraft bei der Modellierung von Programmen.

Scala ermรถglicht funktionale Programmierung, indem Funktionen als vollwertige Objekte behandelt werden. Dadurch kรถnnen sie als Werte an andere Funktionen รผbergeben und auch als Werte zurรผckgegeben werden. Die Kombination dieser beiden Paradigmen macht Scala zu einer hervorragenden Wahl fรผr die Entwicklung komplexer Software in Branchen wie der Datenwissenschaft.

Wichtige Frameworks auf Scala

Hier sind einige wichtige Frameworks fรผr Scala:

  • Spielen ist ein Open-Source-Webanwendungs-Framework, das verwendet MVC-ArchitekturEs wurde 2007 verรถffentlicht und steht heute unter der Apache-Lizenz. Bis 2013 entwickelte es sich zu einem der beliebtesten Frameworks auf GitHub. Unternehmen wie LinkedIn, WalmartSamsung und Eero nutzen dieses Framework.
  • Lift Lift ist ein weiteres kostenloses Webframework, das in Scala geschrieben und 2007 verรถffentlicht wurde. Foursquare nutzt das Lift-Framework. Es ist ein leistungsstarkes Framework, mit dem sich schnell Anwendungen entwickeln lassen.
  • Akka bietet ein Toolkit zum Erstellen hochgradig paralleler, verteilter und robuster nachrichtenbasierter Anwendungen auf der JVM.
  • Katzen ist eine Bibliothek, die Abs bietettracKonzepte fรผr die funktionale Programmierung.
  • Spark ist eine einheitliche Analyse-Engine fรผr die Verarbeitung groรŸer Datenmengen, die in Big-Data- und Machine-Learning-Workflows weit verbreitet ist.

Parallelitรคtsunterstรผtzung

  • In Scala sind die Werte standardmรครŸig unverรคnderlich, was es sehr anpassungsfรคhig an Umgebungen mit gleichzeitiger Verarbeitung macht.
  • Scala verfรผgt รผber viele Eigenschaften, die es ideal fรผr parallele Anwendungen machen.
  • Futures und Promises erleichtern die asynchrone Datenverarbeitung und unterstรผtzen so die Parallelitรคt.
  • Akka ist ein Toolkit, das das Actor-Concurrency-Modell verwendet. Actors werden aktiv, wenn sie Nachrichten empfangen.
  • Parallelitรคt mit Threads aus Java wird auch in Scala unterstรผtzt.
  • Streamverarbeitung ist eine weitere groรŸartige Funktion, die eine kontinuierliche Echtzeitverarbeitung von Daten ermรถglicht.

Scala verfรผgt รผber einige der besten Parallelitรคtsbibliotheken der Java ร–kosystem:

  • Ureinwohner Java Threads.
  • Fibers aus Bibliotheken wie Vertx.
  • ZIO ist eine Bibliothek mit Grundfunktionen zur Unterstรผtzung von Parallelverarbeitung und asynchroner Berechnung.
  • Software Transactional Memory (STM) fรผr Transaktionen.
  • Future, das in die Scala-Sprache integriert ist.

Java Vergleich mit Scala

Hier sind die wichtigsten Unterschiede zwischen Java und Scala.

Scala Java
Kompakter und prรคgnanter. Vergleichsweise grรถรŸere Codeabschnitte.
Konzipiert und entwickelt, um sowohl objektorientiert als auch funktional zu sein. Unterstรผtzt eine Vielzahl von funktionalen Programmiermerkmalen wie Parallelverarbeitung und Unverรคnderlichkeit. Ursprรผnglich als objektorientierte Sprache entwickelt, unterstรผtzt sie seit neueren Versionen auch funktionale Programmierfunktionen. Fรผr die funktionale Programmierung ist sie jedoch noch nicht so leistungsstark wie Scala.
Nutzt das Akteurmodell zur Unterstรผtzung von Parallelverarbeitung. Verwendet das herkรถmmliche Thread-basierte Modell fรผr Parallelitรคt.
Unterstรผtzt Frameworks wie Play und Lift. Unterstรผtzt Spring, Grails und viele weitere.
Unterstรผtzt verzรถgerte Auswertung. Unterstรผtzt keine verzรถgerte Auswertung nativ.
Keine statischen Elemente. Enthรคlt statische Elemente.
Unterstรผtzt die รœberlastung des Bedienpersonals. Unterstรผtzt keine รœberlastung des Bedienpersonals.
Die Kompilierung des Quellcodes ist vergleichsweise langsam. Die Kompilierung des Quellcodes ist schneller als bei Scala.
Eigenschaften verhalten sich wie Java 8-Schnittstellen. Java 8 Schnittstellen versuchen, die Lรผcke zwischen Klassen und Schnittstellen zu schlieรŸen.
Beim Aktualisieren von Versionen ist manchmal eine รœberarbeitung erforderlich. Eine รœberarbeitung zwischen den Versionen ist im Allgemeinen nicht erforderlich.
Typsicherheit gewรคhrleistet eine hohe Zuverlรคssigkeit des Codes, aber keine absolute Fehlerfreiheit. Starke statische Typing hilft dabei, viele Laufzeitfehler zu reduzieren.
Es gibt einige Einschrรคnkungen hinsichtlich der Abwรคrtskompatibilitรคt zwischen den Hauptversionen. Starke langfristige Abwรคrtskompatibilitรคt.
Operators werden als Methodenaufrufe behandelt. Operators sind eine spezielle Syntax und keine Methodenaufrufe.
Unterstรผtzt Mehrfachvererbung mittels Merkmalen. Unterstรผtzt keine Mehrfachvererbung mittels Klassen; verwendet stattdessen Schnittstellen.
Code ist in kompakter Form verfasst. Code ist in einer ausfรผhrlicheren Form geschrieben.
Scala enthรคlt nicht das Schlรผsselwort static. Java enthรคlt das Schlรผsselwort static.

Hรคufig gestellte Fragen

Scala hat eine steilere Lernkurve als Java weil es objektorientierte und funktionale Stile vereint. Allerdings haben Entwickler mit Java Mit etwas Erfahrung lernt man die Grundlagen meist schnell. รœbung mit kleinen Projekten und der Scala REPL beschleunigt den Lernprozess.

Ja. Scala treibt weiterhin groรŸ angelegte Systeme in Unternehmen an, die Akka verwenden. Sparkund Kafka. Die Nachfrage ist weiterhin hoch in den Bereichen Data Engineering, Fintech und verteilte Systeme, wo JVM-Performance und funktionale Programmierung von Bedeutung sind.

Ja. Moderne KI-Programmierassistenten verstehen die Scala-Syntax, das Typsystem und Frameworks wie Akka und SparkSie helfen dabei, Boilerplate-Code zu generieren, funktionale Muster vorzuschlagen, Compilerfehler zu erklรคren und Code zu refaktorisieren, wodurch die Entwicklung sowohl fรผr Anfรคnger als auch fรผr Experten beschleunigt wird.

Scala steuert Apache SparkScala ist die fรผhrende Engine fรผr die Verarbeitung groรŸer Datenmengen in KI-Pipelines. Bibliotheken wie Breeze, Smile und Figaro unterstรผtzen numerische Berechnungen, maschinelles Lernen und probabilistische Modellierung und machen Scala damit zu einer hervorragenden Wahl fรผr produktive Data-Science-Anwendungen.

Ein `val` erzeugt eine unverรคnderliche Bindung, die sofort ausgewertet wird. Ein `var` erzeugt eine verรคnderliche Bindung, die neu zugewiesen werden kann. Ein `lazy val` verzรถgert die Auswertung, bis zum ersten Zugriff auf den Wert, und speichert das Ergebnis dann fรผr nachfolgende Lesevorgรคnge im Cache.

Fassen Sie diesen Beitrag mit folgenden Worten zusammen: