Die zwei statischen iterate(…)-Methoden generieren einen Stream aus einem Startwert und einer Funktion, die das nächste Element produziert. Bei iterate(T seed,
UnaryOperator<T> f) ist der Strom unendlich, bei der zweiten – in Java 9 hinzugekommenen Methode – iterate(…, Predicate<? super T> hasNext, …)-Methode beendet ein erfülltes Prädikat den Strom und erinnert an eine klassische for-Schleife. Der Abbruch über ein Prädikat ist sehr flexibel, denn bei der ersten iterate(…)-Methode ist das Stoppen immer ein Problem und so folgt oftmals ein limit(…) oder takeWhile(…) zum Limitieren der Elemente.
Beispiele
Produziere Permutationen eines Strings.
UnaryOperator<String> shuffleOp = s -> { char[] chars = s.toCharArray(); for ( int index = chars.length - 1; index > 0; index-- ) { int rndIndex = ThreadLocalRandom.current().nextInt( index + 1 ); if ( index == rndIndex ) continue; char c = chars[ rndIndex ]; chars[ rndIndex ] = chars[ index ]; chars[ index ] = c; } return new String( chars ); }; String text = "Sie müssen nur den Nippel durch die Lasche ziehn"; Stream.iterate( text, shuffleOp ).limit( 10 ).forEach( System.out::println );
Erzeuge einen BigInteger-Stream ab 10 Millionen alle Zahlen aus, bis mit hoher Wahrscheinlichkeit eine Zufallszahlen erscheint.
Predicate<BigInteger> isNotPrime = i -> ! i.isProbablePrime( 10 ); UnaryOperator<BigInteger> incBigInt = i -> i.add( BigInteger.ONE ); Stream.iterate( BigInteger.valueOf( 10_000_000 ), isNotPrime, incBigInt ) .forEach( System.out::println );