lumyn.org

PPR 24/25

Streams, Collections, Iterators

Streams

Streams stellen beliebige Ströme von Objekten in Java dar. Man betrachte folgendes Beispiel, in dem jede gerade Zahl aus einer Liste inputList in eine Liste outputList kopiert wird, mit anschließender Ausgabe:
List<Integer> inputList = Arrays.asList(0, 1, 2, 3, 4, 5);
List<Integer> outputList = new ArrayList<>();
for (int k : inputList) {
    // Is k even?
    if (k % 2 == 0) {
        // Yes -> add k to output.
        outputList.add(k);
    }
}
for (int l : outputList) {
    System.out.println(l);
}
Mit Streams kann man diesen Sachverhalt prägnanter ausdrücken.
inputList.stream().filter(x -> x % 2 == 0).forEach(outputList::add);
outputList.forEach(System.out::println);
Streams sind sehr flexibel und sind oft sogar effizienter als imperativ inspirierter Code. Der eingebaute Autocomplete von IntelliJ kann einem einen Überblick geben, was man alles so anstellen kann.
Hier lauffähiger Source-Code zum Ausprobieren:
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

public class Main {
    public static void main(String[] args) {
        List<Integer> inputList = Arrays.asList(0, 1, 2, 3, 4, 5);
        List<Integer> outputList = new ArrayList<>();
        for (int k : inputList) {
            // Is k even?
            if (k % 2 == 0) {
                // Yes -> add k to output.
                outputList.add(k);
            }
        }
        for (int l : outputList) {
            System.out.println(l);
        }

        outputList.clear();

        inputList.stream().filter(x -> x % 2 == 0).forEach(outputList::add);
        outputList.forEach(System.out::println);
    }
}

Collections, Iterators

Collection ist ein Sammelbegriff (und gleichzeitig ein Interface, siehe java.util.Collection) für alle Ansammlungen von Objekten in Java, sei es geordnet, ungeordnet, oder sonst wie. Die genaue Spezifikation kann man der Dokumentation entnehmen.
Iterator sind Objekte, über die iteriert werden können. Hinter jedem Iterator steckt ein Mechanismus, welcher nach und nach Objekte erzeugt. Nimmt man z.B. aus einer Collection einen Iterator (Collection::iterator), wird dieser einfach nach und nach die Elemente der Collection ausgeben, bis keine mehr übrig sind. MongoCursor implementiert Iterator.