Die Java 8 Streams haben den Umgang mit Collections grundlegend verändert. Statt den Inhalt von Collections mit for- oder while-Schleifen zu bearbeiten, erlauben die Streams eine Aneinanderkettung von Operationen, die über die Elemente der Collection ausgeführt werden. Das Debuggen solcher Implementierungen ist mit dem Java Stream Debugger Plugin für IDEA eine sehr einfache Geschichte. Dieser Artikel zeigt ein kurzes Beispiel.
Nehmen wir ein einfaches Code-Beispiel:
List<Integer> numbers = Arrays .asList(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16); int sumOfAllEvenNumbers = numbers .stream() .mapToInt(Integer::intValue) .filter(number -> number % 2 == 0) .peek(System.out::println) .sum(); System.out.print("Sum of all even numbers: " + sumOfAllEvenNumbers); }
Eine Liste von Ganzzahlen wird zunächst auf den primitiven Datentyp int
gecastet, um damit Rechenoperationen durchführen zu können. Wir wollen einen Teil der Zahlen summieren.
Danach filtern wir alle ungeraden Zahlen heraus, da wir nur die Summe aller geraden Zahlen bilden wollen.
Zwischendurch geben wir alle Zahlen, die nach der Filterung noch übrig sind, mit System.out.println
auf der Konsole aus.
Am Ende bilden wir die Summe. Diese geben wir außerhalb des Streams ebenfalls auf der Konsole aus.
Streams debuggen
Wie funktioniert das Debuggen der Stream-API? Herkömmliche Java-Debugger sind meist keine große Hilfe.
Die Implementierung einer Stream-Verarbeitung ist von der Java-Syntax her eigentlich nur eine sehr lange Zeile Java-Code. Das Java Stream Debugger Plugin für IDEA nimmt sich dieses Problems an. Wie das genau aussieht?
Zunächst installieren wir das Plugin. Dann setzen wir einen Breakpoint in einer der Stream-Codezeilen und drücken dann das Filter-Symbol:
Der Klick auf das Filter-Symbol zeigt uns für jeden Bearbeitungsschritt im Stream den zu dieser Zeit bestehen Inhalt des Streams. Ganz rechts sehen wir das Endergebnis der Verarbeitung.
Weiterhin ist es möglich, einzelnen Werten auf Ihrem Verarbeitungsweg durch den Stream zu folgen. Ein Klick auf den Ausgangswert zeigt seinen Weg im Debugger auf.
Kurzes Fazit
Mit diesem Plugin lässt sich zumindest ein Argument gegen die Verwendung von Stream, das mir oft zu Ohren kommt, entkräften. Dass sich Streams nicht ordentlich debuggen lassen, entspricht spätestens mit diesem Plugin nicht mehr der Wahrheit.