Lazy Evaluation und Streams

Aktualisiert am:

Lazy Evalutian

Unter „lazy evaluation” (=faule/bequeme Auswertung) versteht man das aneinanderreihen von Befehlen, ohne sie jedoch sofort auszuwerten, sondern erst auszuführen, wenn deren Ergebnis benötigt wird. Dies hat den Vorteil, dass unnötiges Kopieren von Daten vermieden wird. Theoretisch erlaubt diese Methode den Umgang mit unendlichen Datenmengen, denn es entsteht ein sogenannter Datenstrom. (siehe Streams)

Streams

Ein Stream ist eine Datenstruktur, die es theoretisch ermöglicht, mit einem unendlichem Strom von Daten umzugehen. Die Elemente eines Streams werden üblicherweise mit einem Iterator abgerufen bzw. aufgezählt. Streams stellen üblicherweise die folgenden Methoden zur Verfügung:

  • map: wendet eine Funktion auf das gegebene Element an. (Der Typ des Streams kann sich dabei unter Umständen ändern)
  • filter: filtert alle Elemente heraus, die nicht die Bedingung erfüllen.
  • reduce: reduziert die Elemente auf ein Ergebnis.
  • usw.

IterableStream

Ein IterableStream nutzt einen abstrakten Datentyp, wie eine List, ein Array oder einen anderen Stream. Als Operationen stehen häufig die Methoden map oder filter zur Verfügung. Durch das Anwenden der Funktionen entsteht eine verkettete Struktur von Daten.

Es gibt sogar sinnvolle Anwendungsfälle für unendliche Streams, beispielsweise die Berechnung möglichst vieler Primzahlen, oder die Pakete in einem Netzwerk-Stream.

Die Funktion map: Sie führt eine beliebige Funktion für jedes Element aus. Der Rückgabewert wird wieder als Element für den neuen Stream verwendet. Die Laufzeit in der O-Notation liegt in O(1) .

Die Funktion filter: Sie filtert Elemente anhand eines gegebenen Prädikats und gibt nur die Elemente zurück, welche diesem entsprechen. Das heißt, die Menge der Elemente könnte sich hier reduzieren. Die Laufzeit liegt in O(1).

Die Funktion reduce: Im Gegensatz zu map und filter wird hier kein neuer Stream erzeugt, sondern die Elemente werden zu einem Ergebnis reduziert. Die Laufzeit liegt in O(n.accumulate(n) + next (n))

Weitere Beiträge aus dieser Serie

Schreibe einen Kommentar

Notify me of followup comments via e-mail. You can also subscribe without commenting.