Es ist ungefähr zwei Jahre her, seit ich angefangen habe, Scala zu benutzen. Ich liebe Scala, deshalb empfehle ich es den Ingenieuren um mich herum, aber es scheint, dass es ein abstoßendes Gefühl gibt wie "Funktionale Sprache? Es scheint schwierig und Java ist nicht gut?" Sicher, es ist schwierig, alle Funktionen von Scala zu nutzen, aber wenn Sie nur die Güte von Scala kennenlernen möchten, müssen Sie "funktional" nicht von Anfang an verstehen. Hier sind einige der Funktionen von Scala, die für Java-Ingenieure attraktiv sind.
Scala hat einen Paketmanager namens sbt, der auch mit jeder von Maven vertriebenen Bibliothek verwendet werden kann. Sie können Scala und Java auch im Quellcode Ihres Projekts koexistieren lassen. Mit anderen Worten, Sie müssen den Quellcode nicht auf einmal ersetzen, und Sie können sagen: "Probieren wir nur die neuen Funktionen aus, die wir mit Scala erstellen."
case class
Erstellen Sie eine Münzklasse mit "Preis" (Betrag) und "Einheit" (Einheit). Verwenden Sie es für 100-Yen-Münzen wie "neue Münze (100,0," Yen ")". Wenn Sie eine Fallklasse verwenden, können Sie wie folgt schreiben.
Coin.scala
case class Coin(price: Double, unit: String)
Der entsprechende Code in Java lautet wie folgt. (Um genau zu sein, überschreibt es "hashCode", "toString", "copy" usw., aber es wird zu lang sein, also werde ich es weglassen.)
JavaCoin.java
public class JavaCoin {
public final double price;
public final String unit;
public JavaCoin(double price, String unit) {
this.price = price;
this.unit = unit;
}
@Override
public boolean equals(Object obj) {
if (obj instanceof JavaCoin) {
JavaCoin another = (JavaCoin) obj;
return this.price == another.price && this.unit.equals(another.unit);
}
return false;
}
}
Es ist überwältigend kurz. Ich denke, Kürze ist Gerechtigkeit.
Die Elemente, aus denen ein Programm besteht, sind ** Ausdrücke ** und ** Anweisungen **. Per Definition ist derjenige, der den Wert zurückgibt, ein Ausdruck, und alles andere ist eine Anweisung. In Java sind "if", "for", "switch" usw. Anweisungen, in Scala sind dies alles Ausdrücke. Ein konkretes Beispiel wird später erläutert.
switch
ist mächtigFügen Sie der Coin-Klasse die folgende Methode hinzu. Eine Methode, die "Einheit" mit "Dollar" ausrichtet.
Coin.scala
def toDollar: Coin =
this match {
case Coin(_, "Dollar") => this
case Coin(_price, "Cent") => Coin(_price * 0.01, "Dollar")
case Coin(_price, "Yen") => Coin(_price * 0.088, "Dollar")
}
match
ist switch
in Scala.
Wie oben erwähnt, können Sie mit "case class" Eigenschaften abgleichen und an Variablen binden.
(Eigentlich sollten Sie Polymorphismus verwenden, aber ich werde ihn diesmal nicht verwenden, da er kompliziert sein wird.)
Außerdem habe ich nicht "return" geschrieben, aber in Scala ist das Ergebnis des Ausdrucks der Rückgabewert, ohne etwas zu schreiben.
In Scala ist "match" ein Ausdruck, also ein Rückgabewert.
Fügen Sie der Coin-Klasse die folgende Methode hinzu. Eine Methode, die zwei Münzen hinzufügt.
Coin.scala
def +(another: Coin): Coin =
if (this.unit == another.unit)
Coin(this.price + another.price, this.unit)
else
this.toDollar + another.toDollar
Wenn die "Einheiten" gleich sind, werden sie so hinzugefügt, wie sie sind, und wenn sie unterschiedlich sind, werden sie in Übereinstimmung mit dem "Dollar" hinzugefügt. Es kann wie folgt als Operator verwendet werden.
println(
Coin(1, "Dollar")
+ Coin(10, "Cent")
+ Coin(25, "Cent")
+ Coin(100, "Yen")
+ Coin(500, "Yen")
)
// Coin(54.15,Dollar)
Wie Sie vielleicht beim Lesen bemerkt haben, weist Scala im Grunde genommen keine Neuzuweisung zu. Es ist dasselbe wie die Java-Enddeklaration. Sie könnten fragen: "Warum verwenden Sie in Java nicht" final "?". Es ist jedoch wichtig zu beachten, dass die meisten Sprachspezifikationen, Standardbibliotheken und Bibliotheken von Drittanbietern in Scala dieser Regel folgen. Nicht neu zuweisen kann so umformuliert werden, dass es keinen Status gibt. Wenn es keinen Status gibt, wird der Rückgabewert der Funktion nur durch das Argument bestimmt, was das Denken vereinfacht. Es gibt viele Vorteile, z. B. nicht den Wert jeder Variablen im Debugger überprüfen oder einen Testfall schreiben zu müssen, der den Status annimmt. Es ist eine Umwegserklärung, aber Sie sollten in der Lage sein, die Stärke dieser Regel zu erkennen, während Sie sie verwenden. (Eigentlich setzt dieser Punkt einen Fuß in das Konzept des Funktionstyps, aber ich habe es erklärt, weil ich denke, dass es das wichtigste ist.)
Es ist lange her, aber danke fürs Lesen. Es gibt noch viele Orte, die ich vorstellen möchte, aber da es kein Ende gibt, werde ich hier enden. Heutzutage übernehmen immer mehr Unternehmen Scala, und ich hoffe, dieser Artikel hilft.
Coin.scala
case class Coin(price: Double, unit: String) {
def toDollar: Coin =
this match {
case Coin(_, "Dollar") => this
case Coin(_price, "Cent") => Coin(_price * 0.01, "Dollar")
case Coin(_price, "Yen") => Coin(_price * 0.088, "Dollar")
}
def +(another: Coin): Coin =
if (this.unit == another.unit)
Coin(this.price + another.price, this.unit)
else
this.toDollar + another.toDollar
}
object Coin extends App {
println(
Coin(1, "Dollar")
+ Coin(10, "Cent")
+ Coin(25, "Cent")
+ Coin(100, "Yen")
+ Coin(500, "Yen")
)
// Coin(54.15,Dollar)
}
Recommended Posts