Als Java zum ersten Mal entwickelt wurde, wurde es als angemessen erachtet, anonyme Funktionen wegzulassen. Ich kann mir zwei Gründe vorstellen (aber sie können sich von den offiziellen unterscheiden):
- Java wurde als objektorientierte Sprache ohne Funktionen entwickelt, daher war es nicht ganz natürlich, anonyme Funktionen in einer Sprache ohne Funktionen zu haben. Zumindest hätte dies das Design der Sprache stark beeinflusst.
- Anonyme Funktionen waren in den Programmierergemeinschaften, die Java anziehen sollte, nicht beliebt (C, C ++, Pascal?). Selbst jetzt scheinen viele Java-Programmierer diese Funktionen als ziemlich exotisch zu betrachten (dies wird sich jedoch mit Java 8 wahrscheinlich sehr schnell ändern).
In den folgenden Jahren bestand die Politik von Sun, wie Robert Harvey erklärt hat, immer darin, Java abwärtskompatibel und sehr stabil zu halten.
Auf der anderen Seite sind andere konkurrierende Sprachen entstanden (das wichtigste ist C #, das als Java-Klon geboren wurde und dann seine eigene Entwicklungsrichtung einnahm).
Konkurrierende Sprachen haben Java aus zwei Gründen unter Druck gesetzt:
Ausdruckskraft
Neue Funktionen können das Schreiben bestimmter Programmiersprachen vereinfachen und die Sprache für Programmierer attraktiver machen. Normalerweise ist der Funktionsumfang einer Sprache ein Kompromiss zwischen Ausdruckskraft, Sprachkomplexität und Designkohärenz: Durch Hinzufügen weiterer Funktionen wird eine Sprache ausdrucksvoller, aber auch komplexer und schwieriger zu beherrschen.
Wie auch immer, in den letzten Jahren haben die Konkurrenten von Java viele neue Funktionen hinzugefügt, die Java nicht hatte, und dies kann als Vorteil angesehen werden.
Hype
Ja, leider ist dies ein Faktor bei der Wahl der Technologie, zumindest was ich in meiner täglichen Erfahrung als Programmierer sehen kann: Ein Tool muss eine bestimmte Funktion haben, auch wenn die meisten Mitglieder des Teams nicht wissen, wie man es verwendet und diejenigen, die es benutzen könnten, brauchen es meistens nicht.
Hype kann für nicht technische Leute wie Manager noch wichtiger sein, die möglicherweise die Plattform für ein bestimmtes Projekt bestimmen. Manager erinnern sich manchmal nur an einige Schlüsselwörter wie Lambda, Parallelität, Multicore, funktionale Programmierung, Cloud Computing usw. Wenn unsere Technologie der Wahl auf jedem Element der Liste eine grüne Markierung aufweist, sind wir auf dem neuesten Stand.
IMO ist also seit einiger Zeit zwischen Java gefangen
- die ursprüngliche Politik der Sprachstabilität und der Einfachheit des Designs, einerseits eine riesige Codebasis und Entwickler-Community, und
- der Druck konkurrierender Sprachen, die Java-Programmierer anziehen könnten, zuerst C # und dann Scala, Clojure, F # (ich nenne diejenigen, die mir bekannt sind, es kann andere geben).
Schließlich beschloss Oracle, Java zu aktualisieren, um es wettbewerbsfähiger zu machen. Meiner Meinung nach richten sich die neuen Funktionen insbesondere an Java-Programmierer, die möglicherweise versucht sind, auf C # umzusteigen, und die andere Sprachen wie Scala und Clojure als zu unterschiedlich von Java ansehen. Auf der anderen Seite haben Entwickler, die Erfahrung mit funktionaler Programmierung haben und dennoch die JVM verwenden möchten, wahrscheinlich bereits auf Scala, Clojure oder eine andere Sprache umgestellt.
Die neuen Java 8-Funktionen werden Java als Sprache leistungsfähiger machen und der erklärte Fokus liegt auf der gleichzeitigen und parallelen Programmierung, aber das Upgrade scheint auch die Marketingaspekte zu berücksichtigen (Mark Reinhold, Chefarchitekt für Java bei Oracle, sagte: "Einige würden Das Hinzufügen von Lambda-Ausdrücken dient nur dazu, mit den coolen Kids Schritt zu halten, und das stimmt, aber der wahre Grund sind Multicore-Prozessoren. Der beste Weg, mit ihnen umzugehen, ist Lambda "(siehe diesen Artikel ).
Ja, viele (alle) Java 8-Funktionen waren bereits bekannt, aber warum und wann eine Funktion zu einer Sprache hinzugefügt wird, hängt von vielen Faktoren ab: Zielgruppe, vorhandene Community, vorhandene Codebasis, Konkurrenten, Marketing usw.
BEARBEITEN
Ein kurzer Hinweis zu "... ich hatte in SIC (1996) über Streams gelesen.": Meinen Sie, dass Sie Java 8-Lambdas benötigen, um Streams zu implementieren? Tatsächlich können Sie sie mit anonymen inneren Klassen implementieren.