Ich benötige einige Codebeispiele (und ich bin auch sehr neugierig darauf) von Scala- und Java-Code, die zeigen, dass Scala-Code einfacher und prägnanter ist als in Java geschriebener Code (natürlich sollten beide Beispiele das gleiche Problem lösen).
Wenn es nur ein Scala-Beispiel mit einem Kommentar wie "Dies ist eine abstrakte Fabrik in Scala, in Java sieht es viel umständlicher aus" gibt, ist dies ebenfalls akzeptabel.
Vielen Dank!
Ich mag am liebsten akzeptiert und diese Antworten
java
scala
comparison
language-features
römisch
quelle
quelle
Antworten:
Lassen Sie uns das Beispiel des Staplers verbessern und die Fallklassen von Scala verwenden :
Die obige Scala-Klasse enthält alle Funktionen der folgenden Java-Klasse und einige weitere - zum Beispiel unterstützt sie den Mustervergleich (den Java nicht hat). Scala 2.8 fügt benannte und Standardargumente hinzu, mit denen eine Kopiermethode für Fallklassen generiert wird, die die gleichen Funktionen wie die with * -Methoden der folgenden Java-Klasse bietet.
Dann haben wir im Gebrauch (natürlich):
Gegen
quelle
productElements
undunapply
nicht im Konstruktor, Feld oder Accessor: gist.github.com/424375case class Person(val firstName: String, val lastName: String)
Na und? Das Ding privat zu machen wäre auch möglich, macht aber keinen Sinn, weil es nicht zutrifft usw.case class Person(private val firstName: String)
, aber Sie sollten dann keine Fallklassen verwenden . Stattdessen tunclass Person(firstName: String)
undfirstName
ist standardmäßig privat.val
undprivate val
besteht darin, ob die Zugriffsmethoden , dhfirstName()
undfirstName(String)
, öffentlich oder privat sind. In Scala sind Felder immer privat. Damit Scala get / set-Methoden im Java-Stil (zusätzlich zu den Accessoren im Scala-Stil) generieren kann, gibt es die@BeanProperty
Anmerkung.Ich fand das beeindruckend
Java
Scala
Sowie diese (Entschuldigung, dass ich nicht eingefügt habe, ich wollte den Code nicht stehlen)
quelle
getFirstName
undgetLastName
Methoden. Dazu müssen Sie die Parameter mitscala.reflect.BeanProperty
Anmerkungen versehen .get
. Der idiomatische Java-Code unterscheidet sich vom idiomatischen Scala-Code. Manchmal dasis
Präfix für Boolesche Werte. davetron5000.github.com/scala-style/naming_conventions/methods/…case class
und das bekommentoString
,equals
und dashashCode
kostenlos (und Sie müssen die Argumente auch nichtval
explizit vorbringen):case class Person(firstName: String, lastName: String)
case class
, nicht nur fürclass
.Aufgabe: Schreiben Sie ein Programm, um eine Liste von Schlüsselwörtern (wie Bücher) zu indizieren.
Erläuterung:
Java:
Scala:
quelle
Aufgabe:
Sie haben eine Liste
people
von KlassenobjektenPerson
mit Feldernname
undage
. Ihre Aufgabe ist es, diese Liste zuerst nachname
und dann nach zu sortierenage
.Java 7:
Scala:
Aktualisieren
Seit ich diese Antwort geschrieben habe, sind einige Fortschritte zu verzeichnen. Die Lambdas (und Methodenreferenzen) sind endlich in Java gelandet und erobern die Java-Welt im Sturm.
So sieht der obige Code mit Java 8 aus (Beitrag von @fredoverflow):
Obwohl dieser Code fast so kurz ist, funktioniert er nicht ganz so elegant wie der Scala-Code.
In Scala Lösung, die
Seq[A]#sortBy
akzeptiert Verfahren eine Funktion ,A => B
woB
erforderlich ist , haben , einOrdering
.Ordering
ist eine Typklasse. Denken Sie am besten an beide Welten:Comparable
Es ist implizit für den betreffenden Typ, aberComparator
es ist erweiterbar und kann nachträglich zu Typen hinzugefügt werden, die es nicht hatten. Da Java keine Typklassen hat, muss es jede solche Methode einmal fürComparable
, dann für duplizierenComparator
. Zum Beispiel siehecomparing
undthenComparing
hier .Mit den Typklassen kann man Regeln schreiben wie "Wenn A eine Reihenfolge hat und B eine Reihenfolge hat, dann hat auch ihr Tupel (A, B) eine Reihenfolge". Im Code heißt das:
So können die
sortBy
in unserem Code nach Namen und dann nach Alter verglichen werden. Diese Semantik wird mit der obigen "Regel" codiert. Ein Scala-Programmierer würde intuitiv erwarten, dass dies so funktioniert. Escomparing
mussten keine speziellen Methoden wie hinzugefügt werdenOrdering
.Lambdas und Methodenreferenzen sind nur eine Spitze eines Eisbergs, der funktionale Programmierung ist. :) :)
quelle
Aufgabe:
Sie haben eine XML-Datei "company.xml", die folgendermaßen aussieht:
Sie müssen diese Datei lesen und die Felder
firstName
undlastName
aller Mitarbeiter ausdrucken .Java: [von hier genommen ]
Scala: [von hier genommen , Folie Nr. 19]
[EDIT von Bill; Überprüfen Sie die Kommentare für die Diskussion] -
Hmm, wie geht das, ohne in einem unformatierten Antwortbereich zu antworten ... Hmph. Ich denke, ich werde Ihre Antwort bearbeiten und Sie sie löschen lassen, wenn es Sie nervt.
So würde ich es in Java mit besseren Bibliotheken machen:
Dies ist nur ein schneller Hack, der keine Magie und alle wiederverwendbaren Komponenten beinhaltet. Wenn ich etwas Magie hinzufügen wollte, könnte ich etwas Besseres tun, als ein Array von String-Arrays zurückzugeben, aber so wie es ist, wäre GoodXMLLib vollständig wiederverwendbar. Der erste Parameter von scanFor ist der Abschnitt. Alle zukünftigen Parameter sind die zu findenden Elemente, die begrenzt sind. Die Benutzeroberfläche kann jedoch leicht poliert werden, um mehrere Übereinstimmungsstufen ohne wirkliches Problem hinzuzufügen.
Ich gebe zu, dass Java im Allgemeinen eine ziemlich schlechte Bibliotheksunterstützung hat, aber es ist einfach nicht fair, eine schreckliche Verwendung von Javas jahrzehntelanger (?) Alter XML-Bibliothek mit einer Implementierung zu vergleichen, die darauf basiert, knapp zu sein aus einem Vergleich der Sprachen!
quelle
Eine Karte der Aktionen, die abhängig von einer Zeichenfolge ausgeführt werden sollen.
Java 7:
Scala:
Und das alles nach bestem Geschmack!
Java 8:
quelle
todos.get("hi")
Gibt zurück,Option[()=>Unit]
was für eine ordnungsgemäße Übereinstimmung erforderlich ist.val defaultFun = {() => println("task not found")}; todos.getOrElse("hi", defaultFun).apply()
val todos = Map("hi" -> { () => println("Good morning!") }) withDefaultValue { () => println("task not found") }
und danntodos("hi")()
Ich schreibe gerade ein Blackjack-Spiel in Scala. So würde meine DealerWins-Methode in Java aussehen:
So sieht es in Scala aus:
Hurra für Funktionen höherer Ordnung!
Java 8-Lösung:
quelle
def dealerWins = !(players exists (_ beats dealer))
Ich mochte dieses einfache Beispiel für Sortieren und Transformieren aus David Pollaks Buch "Beginning Scala":
In Scala:
In Java:
quelle
Wie wäre es mit Quicksort?
Java
Das folgende Java-Beispiel wurde über eine Google-Suche gefunden.
Die URL lautet http://www.mycstutorials.com/articles/sorting/quicksort
Scala
Ein schneller Versuch einer Scala-Version. Offene Saison für Codeverbesserer; @)
quelle
partition
wie Sie dies vermeiden können.Die Antwort von Benutzer unbekannt hat mir so gut gefallen , dass ich versuchen werde, sie zu verbessern. Der folgende Code ist keine direkte Übersetzung des Java-Beispiels, führt jedoch dieselbe Aufgabe mit derselben API aus.
quelle
Ich mag die Methode getOrElseUpdate, die in mutableMap gefunden und hier gezeigt wird, zuerst Java, ohne:
ja - ein WordCount und hier in scala:
Und hier ist es in Java 8:
Und wenn Sie 100% funktionsfähig sein möchten:
filter
undsort
wurden bereits gezeigt, aber schauen Sie, wie einfach sie in die Karte integriert werden:quelle
Dies ist ein sehr einfaches Beispiel: Quadratische Ganzzahlen und fügen Sie sie dann hinzu
In Scala:
Compact Map wendet die Funktion auf alle Elemente des Arrays an.
Nach links falten wird mit 0 als Akkumulator (en) beginnen und
add(s,i)
auf alle Elemente (i) des Arrays angewendet, so dass:Dies kann nun weiter verdichtet werden auf:
Dieses werde ich nicht in Java versuchen (zu viel Arbeit), XML in eine Map verwandeln:
Ein weiterer Liner, um die Karte aus dem XML zu erhalten:
quelle
sumSquare
in Scala ist, dass es für einen Java-Entwickler sehr kryptisch aussieht, was ihm Munition gegen Sie gibt, um sich zu beschweren, dass Scala dunkel und kompliziert ist ...Problem: Sie müssen eine Methode entwerfen, die einen bestimmten Code asynchron ausführt.
Lösung in Java :
Das Gleiche in Scala (mit Schauspielern):
quelle
Das Leistungsschaltermuster aus Michael Nygards Release It in FaKods ( Link zum Code )
Die Implementierung in Scala sieht folgendermaßen aus:
Was ich super schön finde. Es sieht nur wie ein Teil der Sprache aus, ist aber eine einfache Mischung im CircuitBreaker-Objekt , die alle Arbeiten ausführt .
Referenz in anderen Sprachen Google für "Leistungsschalter" + Ihre Sprache.
quelle
Ich bereite ein Dokument vor, das mehrere Beispiele für Java- und Scala-Code enthält und nur die einfach zu verstehenden Funktionen von Scala verwendet:
Scala: Ein besseres Java
Wenn Sie möchten, dass ich etwas hinzufüge, antworten Sie bitte in den Kommentaren.
quelle
Warum das noch niemand gepostet hat:
Java:
116 Zeichen.
Scala:
56 Zeichen.
quelle
Application
Eigenschaft als schädlich angesehen ... scala-blogs.org/2008/07/…Faul bewertete unendliche Ströme sind ein gutes Beispiel:
Hier ist eine Frage zu unendlichen Streams in Java: Ist ein unendlicher Iterator ein schlechtes Design?
Ein weiteres gutes Beispiel sind erstklassige Funktionen und Verschlüsse:
Java unterstützt keine erstklassigen Funktionen, und die Nachahmung von Abschlüssen mit anonymen inneren Klassen ist nicht sehr elegant. Eine andere Sache, die dieses Beispiel zeigt, dass Java nicht kann, ist das Ausführen von Code von einem Interpreter / REPL. Ich finde das immens nützlich, um Code-Schnipsel schnell zu testen.
quelle
Iterable
undIterator
unendliche Streams erzeugen.Dieser Scala-Code ...
... wäre in Java, wenn möglich, überhaupt nicht lesbar.
quelle