Streams und Collections in Java 8

Sprachen  –  6 Kommentare

Die wesentliche Neuerung von Java 8 ist die Erweiterung der Sprachmittel um Lambda-Ausdrücke. Sie erlauben einen funktionalen Programmierstil in der ja eigentlich rein objektorientierten Sprache. Dieser Artikel zeigt, wie sich Lambda-Ausdrücke und Patterns wie Filter-Map-Reduce in den ebenfalls neuen Streams nutzen lassen, wenn auf Collections operiert wird.

Im Januar gingen zwei Meldungen durch den Heise-Ticker: "Scala wird 10 Jahre alt" und "JDK 8 kommt im März 2014". Nur auf den ersten Blick haben die beiden Meldungen nichts miteinander zu tun. Tatsächlich haben Scala und andere Sprachen wie Clojure, Kotlin oder Ceylon in den letzten Jahren das funktionale Programmierparadigma auf der Java Virtual Machine (JVM) populär gemacht und nun auch die Programmiersprache Java selbst beeinflusst. Das zeigt ein Vergleich zwischen verschiedenen "Java-Alternativen für den industriellen Einsatz".

Quellcode zum Artikel

Die im Artikel gezeigten Programmbeispiele finden Sie auf dem FTP-Server von heise Developer zum Download.

Mit den nun erschienenen Java 8 wird nun ein wesentlicher Meilenstein erreicht, der Einflüsse funktionaler Programmiersprachen aufgreift: Das Project Lambda aus dem JSR 335 hat seit 2009 das Ziel, Java um Lambda-Ausdrücke und verwandte Features zu erweitern. Lambdas sind das Sprachfeature der nächsten Java-Version schlechthin und seit den Generics in Java 5 erstmals wieder eine signifikante Spracherweiterung.

Im Folgenden geht der Artikel darauf ein, wozu ein funktionaler Programmierstil gut ist, und zeigt die funktionalen Erweiterungen des JSR 335. Schwerpunkt sind hier die neuen funktionalen Interfaces, die höherwertige Patterns wie Filter-Map-Reduce ermöglichen. Sie bilden die Grundlage für die neuen Java-Collections und die neuen Streams, auf die der Artikel dann ausführlich eingeht.

Alle nachstehenden Code-Beispiele sind getestet mit der Version 1.8b128 (RC 1 von Anfang Februar 2014). Größere API-Abweichungen in Folgeversionen beziehungsweise im finalen Release sind nicht mehr zu erwarten.

Lambdas und verwandte Java-8-Features

Die neuen Lambda-Ausdrücke kommen nicht alleine, sondern im Zusammenspiel mit diesen JSR-335-Techniken:

  • Funktionale Interfaces wie Function, Consumer und Predicate
  • Referenzen auf Methoden
  • Eine verbesserte Typinferenz, um einen Lambda-Ausdruck mit einem funktionalen Interface oder einer Methodenreferenz zu verknüpfen
  • Virtual Extension Methods für Default-Implementierungen in Interfaces
  • Nutzung dieser Features in erweiterten Java-Collections und Streams

Die Abbildung 1 zeigt, wie die Techniken des JSR 335 aufeinander aufbauen. Für eine weiterführende Syntaxerläuterung von Lambda-Ausdrücken, Methodenreferenzen und Default-Methoden sei auf die Artikel von Michael Kofler, Maurice Naftalin und Brian Goetz verwiesen.

Lambda-Ausdrücke und verwandte Java-8-Features aus dem JSR 335 (Abb. 1)