Warum Scala über Java verwenden?

16

Ich stehe total auf Scala als Sprache ... und habe immer noch Probleme damit, warum ein Unternehmen von Java auf Scala wechseln sollte. Ist Scala nur syntatischer Zucker auf der JVM oder gibt es grundlegende Verbesserungen in Scala gegenüber Java, die reale Anwendungen verbessern würden?

Dakotah North
quelle
4
Dies bekam ein Duplikat irgendwo zu haben.
2
Es hört sich so an, als hättest du es oft benutzt (Scala) (nun, mehr als ich) - was hast du in deinen persönlichen Erfahrungen gefunden?
FrustratedWithFormsDesigner
Ich habe folgende Fragen gesehen: Was halten Java-Entwickler von Scala? Was soll ich als Java-Entwickler als Nächstes tun? Wie starte ich die Migration von Java nach Scala? Eine Antwort, die sich auf die treibenden Gründe für die Verwendung von Scala als Programmiersprache für die Entwicklung in der realen Welt konzentriert.
Dakotah North
1
@delnan, zumindest auf SO: stackoverflow.com/questions/6073517/… . @DakotahNorth, bitte poste nicht zwischen SE-Seiten - wähle das für deine Frage am besten geeignete Forum aus und poste nur dort. Auf anderen Websites wird Ihr Beitrag sowieso geschlossen, genau wie dies bei SO der Fall war.
Péter Török
1
Hier ist ein weiteres, fast genaues Duplikat von SO mit hervorragenden Antworten: stackoverflow.com/questions/2683914/…
Péter Török

Antworten:

19

Haftungsausschluss: Ich bin kein Scala-Guru.

Scala macht zwei Dinge sehr gut, die Java (derzeit) nicht macht.

Funktionsprobleme lösen

  • Auf der einfachsten Ebene hat Scala Schließungen mit Unterstützung für Sammlungen abgeschlossen. Dies bedeutet, dass Sie keinen Kesselschildcode mehr schreiben müssen, wie z. B. (schamlos von einem DZone-Beitrag abgerissen).

    public List<Item> bought(User user)
    {
        List<Item> result = new ArrayList();
        for (Item item : currentItems)
        {
            if (user.bought(item))
            {
                result.add(item);
            }
        }
        return result;
    }

Aber schreibe stattdessen etwas wie:

def bought(user: User) = items.filter(user bought _)
  • Es gibt mehr funktionale Liebe, aber ich bin nicht qualifiziert, darüber zu sprechen, da ich momentan immer noch am funktionalen Programmieren arbeite :)

Lösen Sie Nebenläufigkeiten sicherer

  • Scala hat ein Schauspielermodell (+ einige andere Vorteile), das von Natur aus sicherer ist als Javas veränderbare Daten.

Ich kann ehrlich gesagt nicht über allzu viel nachdenken, was Scala über Java erhebt. Viele kleine Gewinne und Verbesserungen ja, aber auch viel mehr Seil zum Aufhängen. YMMV

HTH ein bisschen

Martijn Verburg
quelle
3
Ich möchte darauf hinweisen, dass akka (Actor Model) sowohl für Scala als auch für Java verfügbar ist. Siehe akka.io
Giorgio
5
Ich mag Scala und migriere von Java. Trotzdem ärgert es mich, wenn man Java und Scala vergleicht und Scala-Entwickler versuchen, so ausführlichen und mehrzeiligen Java-Code wie möglich zu schreiben, und sehr bemüht sind, ihn durch Scala One Liner zu ersetzen. Ohne den Verlust der Lesbarkeit über Java könnte Code in 5 Zeilen passen, nicht in 12
matt
2
"Viele kleine Gewinne und Verbesserungen ja, aber auch viel mehr Seil zum Aufhängen." +1
Rob
@lucek Zumal das Snippet Cs geschweifte Klammern anstelle von Javas verwendet: P
Andres F.
@robjb: "Viele kleine Gewinne und Verbesserungen ja, aber auch viel mehr Seil zum Aufhängen." Ich stimme nicht zu, dass Scala dir mehr Seil gibt, mit dem du dich aufhängen kannst. Zumindest gibt es keine Erklärung für diese Aussage in der Antwort und ich kann selbst keine sehen. Außerdem führt Scala nicht nur ein paar funktionale Redewendungen über eine OO-Sprache (wie z. B. C # und Java 8) ein, sondern versucht, OOP und FP in ein Paradigma zu integrieren. IMHO ist dies keine "kleine Verbesserung", sondern ein Paradigmenwechsel.
Giorgio
9

Das hängt von Ihrer Definition von "nur syntaktischem Zucker" ab. Inwiefern ist Java beispielsweise mehr als nur syntaktischer Zucker über Maschinencode?

Jede Sprache kann weniger als Maschinencode, aber keine Sprache kann mehr.

Was Hochsprachen auf den Tisch bringen, ist, dass Code leichter zu lesen und zu verstehen, leichter zu komponieren und mehr Fehler zu erkennen ist. Und meiner Meinung nach ist dies der erste, der den größten Unterschied macht - genau "nur syntaktischer Zucker".

Aber wenn man nur die beiden anderen betrachtet, gibt es immer noch Vorteile von Scala gegenüber Java.

Nicht um den Punkt zu beleuchten, aber Verschlüsse zu haben, macht den Code komponierbarer, als keine Verschlüsse zu haben. Und während Java 7 so genannte Closures hinzufügt , wird dies nicht der Fall sein - es handelt sich lediglich um anonyme Funktionen.

Wenn es darum geht, mehr Fehler zu finden, ist der überlegene Umgang von Scala mit Abweichungen der Beweis dafür. Darüber hinaus verhindert die Betonung der Unveränderlichkeit auch alle Arten von Fehlern - Java kann zwar keine unveränderlichen Aktionen ausführen, verfügt jedoch nicht über die entsprechende Bibliothek.

Daniel C. Sobral
quelle
4
Tatsächlich werden Javas 'Schließungen' nicht vor Java 8
Martijn Verburg,
1
@ Martijn Danke für die Korrektur. Zu diesem Zeitpunkt interessiert es mich eigentlich nicht mehr.
Daniel C. Sobral
1
Ich würde sagen, dass syntaktischer Zucker nur eine alternative Syntax ist, die über die bestehende Semantik hinausgeht. Da die Semantik des Maschinencodes keine Objekte, Klassen usw. enthält, ist Java meines Erachtens nicht nur syntaktischer Zucker über Maschinencode. Das Semantik- und Programmierparadigma ist unterschiedlich.
Giorgio
@Martijn Verburg: Java hat bereits eine Form von Closures (in Form anonymer innerer Klassen). Was es fehlt, sind anonyme Funktionen (die als spezielle anonyme Klassen mit genau einer Methode und einer speziellen Syntax angesehen werden können).
Giorgio
@ Giorgio - wahr, aber die anon innere Klasse ist schlecht im Vergleich zu der bevorstehenden Implementierung auf Basis von Invokedynamic und es ist gut, Quellcode hässlich IMO :-)
Martijn Verburg
2

Hinzu kommt die Antwort von Martijn würde Ich mag hinzufügen , dass Scala mehr expressive als Java und die Vorteile sind , dass (1) es macht Sie produktiver (2) weniger Code zu schreiben , um die gleiche Problemlösung , dass Sie die Fehler reduzieren können in Ihrem Code (IMHO fehlerfreier Code ist ein Mythos).

Sakisk
quelle
0

Ich benutze Scala seit ungefähr 3 Monaten und kann immer noch nichts finden, was ich in Java nicht tun könnte. Für mich buchstäblich auf Scala jede Literatur scheint die gleiche Sache zu erwähnen vorformulierten . Wenn Sie nach einer Reduzierung des Boilerplates suchen, ist Scala genau das Richtige für Sie, aber IMHO. Beispielsweise könnte das oben angegebene Filterbeispiel auch mit Apache-Sammlungen gelöst werden

<T> CollectionUtils.filter(Predicate<T>...)

oder verwenden Sie Verschlüsse wie folgt

<T> CollectionUtils.forAllDo(..., Closure<T>)

Aber natürlich ausführlicher. Ich mag die Typinferenz. Wenn Sie Scala lernen, werden Sie feststellen, dass dies wahrscheinlich sowieso unter der Haube geschieht. Meiner Meinung nach kommt jede Sprache mit + ve und -ve.

user105463
quelle
-3

Listenverständnis, für das Verständnis.

In Java schreiben Sie zum Beispiel:

int myVar;
if (condition) {
  myVar = //some value
}
else {
 myVar = //some other value
}

In Scala ist derselbe Code viel eleganter geschrieben (wie Python) als:

int myVar = (//some value) if (condition) else // other value;

und fertig.

Es gibt so viel, was Scala bietet, dass Java nicht bietet. Es gibt einfach überhaupt keinen Vergleich. Das einzige Problem ist, dass die Leute mit Java besser vertraut sind (das ist es, was sie in CS-Kursen unterrichten) und noch nicht so gut mit dem Scala-Paradigma vertraut sind.

Scala hat eine Tail-Rekursion, es kann Tupel zurückgeben (etwas, das ich in Java 8 denke).

Es ist kein Vergleich. Scala wurde von Martin Ordersky entwickelt, der im Kernteam von Java Generics arbeitete.

Scala ist nur eine weit überlegene Sprache. Das ist alles dazu. Leute, die etwas anderes sagen, haben Scala einfach nicht genug erkundet, um es besser zu wissen.

Oben wollte ich Schwanzrekursionsoptimierung sagen (die die JVM nicht so ausführen kann, wie es der Compiler von Scala kann).

Scala wird auch schneller kompiliert und ausgeführt als JVM-Apps (Ja, das stimmt). Ganz zu schweigen von den Frameworks. Wir verwenden beispielsweise Tomcat und implementieren einige Servelets für die Verarbeitung von REST.

Eine Sache, die Tomcat nicht kann, sind asynchrone Vorgänge, die nicht blockierende E / A erfordern. Zu diesem Zweck haben JAVA-Entwickler in der Regel eine Problemumgehung mithilfe einer Nachrichtenwarteschlange erfunden (senden Sie die Nachricht an die Warteschlange, und ein anderer Prozess oder Thread nimmt sie auf und führt im Hintergrund die gewünschten Aktionen aus).

Leider ist diese Methode cr * p und ein Hack über die Einschränkungen der Bereitstellung von Java-Servlets auf Tomcat.

Gehen Sie Akka + Spray auschecken. Es werden die Schauspieler von Scala verwendet (Schauspieler sind wie Threads, mit der Ausnahme, dass sie nur über Nachrichten kommunizieren können).

Und fertig, asynchrone REST-Aufrufe leicht gemacht. Lang andauernde Hintergrundaufgabe? Kein Problem. Feuern Sie einfach und vergessen Sie, und führen Sie von Zeit zu Zeit ein REST-Polling durch, um den Status des Frontends zu überprüfen.

Wenn Sie immer noch Java verwenden und der Meinung sind, dass es besser ist als Scala, können Sie genauso gut aufhören, Ihren Computer zum Tippen zu verwenden, und zurück zu den Tagen der Federkiels und des Schreibens bei Kerzenlicht gehen. Java ist im Vergleich zu Scala im Grunde genommen ein Antidiluvianer.

Vic
quelle
4
Dies ist kein Beispiel für ein Listenverständnis. Und in Java schreiben Sie:int myVar = condition ? someValue : otherValue
Kevin Cline
1
Sie sollten diese //some value //other valueKommentare bearbeiten, um sie zu /*some value*/formatieren. Die Syntaxhervorhebung wird derzeit
durcheinander gebracht