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:

SDP Multimedia Fehler – Stream sichern – TTCP socket connect failed: 10061

TTCP socket connect failed: 10061 – Wie ein Stream der solch einen Fehler wirft dennoch sichern kann wird in diesem Artikel erklärt

Ich wollte unlängst einen Video Stream sichern. Bei der Nutzung des Programms SDP Multimedia (Streaming Download Project) und bin dabei auf folgenden Fehler gestoßen

TTCP socket connect failed: 10061

sobald ich auf Go geklickt habe.

Da sich die Suche nach einer Lösung dafür länger als erwartet gezogen hat, möchte ich als Hilfestellung für nach mir Suchende eine schnelle Abhilfe für diesen Blocker präsentieren:

Da scheinbar manche mms Streams nicht über den normalen mms Port (1755 siehe http://de.wikipedia.org/wiki/MMS-Protokoll ) abrufbar sind, muss man den Port über den die Daten abgeholt werden umstellen auf zB den HTTP Port 80. Dies kann in SDP Multimedia über Setup –> Setup Options –> Reiter: Protocol abgeändert werden. Einfach den Radio Button bei HTTP aktivieren anstatt TCP und los gehts.

SDP setup

Happy Streaming äh… Streamdownloading :D

Ähnliche Artikel:

Java 7 Tage Project Coin – Automatisches Ressourcen Management

Project Coin stellt eine Sammlung von Neuerungen in der Java Welt dar. Was davon in Java 7 auf uns zukommt, und was das für Streams bedeutet steht hier.

Als vorletzte Verbesserung aus Project Coin in Java 7, welche ich in meinem Blog präsentieren möchte, will ich eine der interessantesten vorstellen. Die Behandlung von Streams und Closable Ressourcen haben ein verbessertes Handling im Try Block erfahren.

close() ist geschichte

Musste man bisher bei den diversen Streams, wie zB den FileInputStream, in einem try-catch-finally block selbst für das Schließen des Blocks sorgen, wird dies nun über neue Interface AutoCloseable geregelt. Dabei fällt nicht nur der finally Block weg, sogar der catch Block ist optional:

    try(InputStream is = new FileInputStream(source); OutputStream os = new FileOutputStream(target)){
        // read / write
    }

Erweiterungen an java.lang.Throwable sorgen dafür dass nach dem try Block automatisch die Streams geschlossen werden. Spart man sich dabei den catch Block werden dabei auftretende Exceptions sogar komplett unterdrückt und kommen nicht zu Tage.

Im try Block lassen sich wie im Beispiel aufgezeigt ein oder mehrere AutoCloseable Ressourcen gleichzeitig deklarieren.

Happy Coding

Ähnliche Artikel: