Filter im Flow
Bevor ein Objekt an Block oder Stream weitergegeben wird, kann ein Filter installiert werden.
Pass
Zum Verständnis des Nachfolgenden wird zuerst die Funktion "pass" genauer betrachtet.
"pass" übergibt das aktuelle Objekt in die weitere Verarbeitung durch ggf. einen Block und ggf. einen Stream.
123.pass
it.print
.print
In diesem Beispiel wird das Int-Objekt "123" an den angehängten Block und den nachfolgenden Stream übergeben. Somit erfolgt zweimal die Ausgabe von "123".
Hierbei können Block oder/und Stream vorhanden sein, müssen jedoch nicht. Allerdings wird immer zuerst der Block und dann der Stream ausgeführt.
123.pass
it.print
123.pass
.print
123.pass.print
In allen drei Fällen wird hier einmalig die "123" ausgegeben.
Weitergeben, aber nur wenn ...
An dieser Stelle können nun Filter installiert werden. Die Funktionen dazu nennen sich:
- passIf
- passIfNot
- passIs
- PassIsNot
Pass, wenn ...
Angenommen, ein Objekt soll nur dann an die weitere Verarbeitung übergeben werden, wenn es größer als 5 ist.
10.times.passIf( cur > 5 ).print
Die "times"-Schleife zählt hier von 1 bis 10. Die Funktion "passIf" prüft jedes Objekt und lässt nur diejenigen durch, welche größer als 5 sind.
"passIfNot" prüft hier die Umkehrung, also ob die Abfrage nicht zutreffend ist.
Pass, aber nur dieses und jenes!
Mit "passIs" werden nur ausgewählte Objekte an die weitere Verarbeitung übergeben.
10.times.passIs( 3,5,6,9 ).print
Times zählt auch hier von 1 bis 10, wobei allerdings nur die zahlen 3,5,6 und 9 zum "print" weitergereicht werden.
Umgekehrt lässt sich ebenso filtern, was nicht weitergegeben werden soll:
10.times.passIsNot( 3,5,6,9 ).print
Hier wird alles zu "print" weiter gereicht, was nicht mit den angegebenen Zahlen überein stimmt. Somit werden nur die Zahlen 1,2,4,7,8 und 10 ausgegeben.
Abbruch
Ähnlich zu den vorherigen Pass-Funktionen existieren noch Break-Funktionen, mit denen die weitere Verarbeitung einer Schleife abgebrochen werden kann.
- breakAt / breakIs
- breakAtNot / breakIsNot
- breakIf
- breakIfNot
Diese Funktionen verhalten sich ähnlich zu den Pass-Funktionen, allerdings wird die aktuelle Schleife im zutreffenden Fall abgebrochen.
Mit all diesen Funktionen lässt sich ein Filter aufbauen, wo nur die gewünschten Objekte weiter verarbeitet werden:
l = [4,3,9,0,5,2,1,7,2,6,4,0,8,2,5]
l.each.passIf( cur > 3 && cur < 8 ).breakAt( 6, 8 )
it.print
In diesem Beispiel wird eine Liste durchlaufen, allerdings nur die Zahlen größer 3 und kleiner 8. Sollte eine 1 oder 6 dabei sein, wird die Verarbeitung unterbrochen.
Effektiv werden hier nur die Zahlen 4, 9, 5 und 7 verarbeitet. Danach wird durch die 6 die Verarbeitung unterbrochen.