Java 8 – Stream API

Java 8 bringt auch Neuerungen im Collections Framework. Die Stream API bietet vereinfachungen für die Verarbeitung von Sequenzen und Zähloperationen.


Java 8 bringt auch Neuerungen im Collections Framework. Es wurde mit dem Ziel erweitert eine einfache Paralellisierung durch Bulk Operations zu ermöglichen. Hierfür wurde von den neuen Möglichkeiten der Interfaces gebrauch gemacht: den default Methoden. Damit wurde zusätzlich sichergestellt, dass die Binär-Kompatiblität zu alten Java Versionen erhalten bleibt. Die so genannten Bulk Operations umfassen Funktionalität, die auf mehrere oder alle Elemente einer Collection angewandt werden können.

Bulk Operations werden dabei mit, ebenfalls in Java 8 eingeführten, Lambda-Ausdrücken oder Methodenreferenzen aufgerufen. Ein Beispiel dafür ist die mit der Stream API eingeführte Filterung

Stream<Foobar> foos = …
foos.filter(Foobar::hasFoo);

Stream API

Streams repräsentieren Sequenzen von Elementen und sind dabei die wesentliche Neuerung im Collections Framework. Ein Stream stellt eine neue Abstraktion im Collections Framwork dar und ist die zentrale Stelle in der die Bulk Operationen gesammelt sind.

Collection-basierte Streams

Dabei ist eine Collection nicht von Haus aus ein Stream sondern muss erst mittels stream() oder parallelStream() erzeugt werden. Anhand der Namen der Erzeugungsmethoden kann man schon erkennen in welche Richtung die Verarbeitung der gestellten Bulk Aufgaben zielt. Bei der Parallelisierung wird der Stream automatisch, mithilfe des in Java 7 eingeführten Fork/Join Frameworks, in kleinere Portionen aufgeteilt und in einem Thread-Pool verarbeitet.

List<String> foos = Arrays.asList(“Foo”, “Bar”, “Foobar”);
foos.parallelStream().filter(Foobar::hasFoo).forEach(System.out::println);

Da einige Stream Methoden wieder eine Instanz von Stream zurückliefern, lassen sich so Verarbeitungsketten bilden. Im Beispiel wird eine vorher gefilterte Liste ausgegeben.

Array-basierte Streams

Diese Konvertierung steht auch für Arrays zur Verfügung und wird mittels der Util Klasse Arrays.stream(array) erzeugt. Aber auch die Stream Klasse selbst bietet diverse Factorymethoden an z.B. Stream.of(“foo”, “bar”,  “foobar”);

Primitive Streams

Neben den selbst aus Objekten generierbaren Streams gibt es auch drei Arten von primitiven Streams: IntStream, LongStream und DoubleStream. Je nach Anwendungsfall kann man sich mit Ausprägungen das Autoboxing ersparen. Dabei bieten IntStream und LongStream besondere Factorymethoden an, die das Erzeugen von Zähl-Sequenzen erleichtern sollen.

// 0 bis 9
IntStream foo = IntStream.range(0,10);
// 0 bis 10
IntStream bar = IntStream.rangeClosed(0,10);

Eine weitere Möglichkeit, eine Sequenz zum Zählen zu bekommen, bietet die Stream API mittels der iterate Methode.

Stream<BigInteger> ints = Stream.iterate(BigInteger.ZERO, i->i.add(BigInteger.ONE));

Zufallszahlen per Stream

Mithilfe von java.util.SplittableRandom kann für jede Art der Primitiven Streams eine Instanz gefüllt mit Zufallszahlen erzeugt werden.

IntStream unlimited = new SplittableRandom().ints();
IntStream limited = new SplittableRandom().ints(3);

 

Weitere Infos gibt es unter anderem unter http://docs.oracle.com/javase/tutorial/collections/streams/index.html

Ähnliche Artikel:

Autor: Thomas Pummer

Thomas Pummer ist Softwareentwickler an der Universität Wien. In seiner Freizeit betreut er das Open Source Projekt TrayRSS und werkt an diversen anderen kleinen Projekten. Er ist sehr interessiert an Open Source und Webentwicklung und testet gern neue Programmiersprachen.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.

*