Ich möchte, dass Sie Scala vorerst als besseres Java verwenden

Einführung

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.

Nutzen Sie Java-Assets

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 meisten Elemente sind Ausdrücke

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ächtig

Fü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.

Bediener überschreiben

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)

Hat keinen Status (wird nicht neu zugewiesen)

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

abschließend

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.

Ganzer Quellcode

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

Ich möchte, dass Sie Scala vorerst als besseres Java verwenden
Verwenden Sie vorerst eine externe Java-Bibliothek
Glassfish Tuning List, die ich vorerst behalten möchte
Ich möchte, dass Sie Enum # name () für den Schlüssel von SharedPreference verwenden
Ich möchte die Java 8 DateTime-API (jetzt) langsam verwenden.
Java14 kam heraus, also habe ich vorerst versucht aufzunehmen
Einführung in Java zum ersten Mal # 2
Java12 kam heraus, also habe ich vorerst den Schalterausdruck ausprobiert
Wenn Sie die Methode außerhalb verwenden möchten
Führen Sie jetzt Dataflow, Java, Streaming aus
Ich möchte Combine auch in UIKit verwenden.
[Java] Ich möchte die Differenz zum Datum berechnen
Ich möchte ES2015 auch in Java verwenden! → (´ ・ ω ・ `)
Befehl, um Docker vorerst zu verwenden
Ich habe [Klonmethode für Java-Arrays] als Klonmethode in Java-Arrays übersetzt.
[Java] Verwenden Sie ResolverStyle.LENIENT, um Datum und Uhrzeit gut zu handhaben
Ich möchte mehrere Rückgabewerte für das eingegebene Argument zurückgeben
Ich möchte die if-else-Anweisung für bedingte Verzweigungen in Java vereinfachen
Ich möchte Java Applet einfach in der Befehlszeile verwenden, ohne IDE zu verwenden
Verwenden Sie JLine, wenn Sie Tastenanschläge auf der Konsole zeichenweise in Java verarbeiten möchten
Ich möchte mit Kotlin und Java zum vorherigen Bildschirm zurückkehren!
Die Geschichte von Collectors.groupingBy, die ich für die Nachwelt behalten möchte
Wenn Sie die Java-Entwicklungsumgebung von Eclipse aus ändern möchten
[Java] Ich möchte mit dem Schlüssel im Objekt eindeutig arbeiten
Wenn Sie eine Methode in RSpec verspotten möchten, sollten Sie die Methode allow für mock und die Singleton-Methode verwenden.
Ein Memo, wenn Sie den Zeitteil des Kalenders löschen möchten
[Java] Verwendung der File-Klasse
Über das Verfahren, damit Java funktioniert
Ich möchte DBViewer mit Eclipse 2018-12 verwenden! !!
[Java] Verwendung der toString () -Methode
Eclipse Ich möchte auf jeden Fall, dass Sie die von Transcendental empfohlene Tastenkombination (Windows) verwenden.
[Verarbeitung × Java] Verwendung der Schleife
(Beschränkt auf Java 7 oder höher) Ich möchte, dass Sie Objekte in Objects.equals vergleichen
[Java] So stellen Sie die Datums- und Uhrzeit auf 00:00:00 ein
[Verarbeitung × Java] Verwendung der Klasse
Ich möchte Java-Updates insgesamt stoppen
Ich möchte die IP-Adresse erhalten, wenn ich mit Java eine Verbindung zu Wi-Fi herstelle
Zum ersten Mal Java lernen [Einführung]
[Verarbeitung × Java] Verwendung der Funktion
Ich möchte @Autowired in Servlet verwenden
Ich ging zum Java Women's Club # 1
Ich möchte den Feldnamen des [Java] -Felds erhalten. (Alter Ton)
[Java Spring MVC] Ich möchte DI in meiner eigenen Klasse verwenden
[Java] Verwendung der Calendar-Klasse
Ich habe versucht, die Grammatik von R und Java zu übersetzen [Von Zeit zu Zeit aktualisiert]
Verwenden Sie die Methode l für die Zeitnotation
Möglicherweise möchten Sie die Methode remove in ArrayList nicht sehr oft verwenden
[Eclipse] Ich möchte die Abschlussfunktion verwenden, aber ich möchte es schaffen, den Abschluss mit einem Leerzeichen zu bestätigen
Ich möchte nur die Zeit aus Zeittypdaten abrufen ...! [Strftime] * Zusätzliche Hinweise
[Deep Learning von Grund auf neu] in Java 1. Zur Zeit Differenzierung und teilweise Differenzierung
R von Java ausführen Ich möchte rJava ausführen