31 Ekim 2023 Salı

Stream.iterate metodu

iterate metodu - seed + unary operator
İmzası şöyle. Sonsuz bir Stream yaratır. limit() ile sınırlamak gerekir
public static<T> Stream<T> iterate(final T seed, final UnaryOperator<T> f)
Açıklaması şöyle. Belirtilen seed değerinden başlar ve unary operator ile seed değeri değiştirilir.
Stream iterate(T seed, UnaryOperator<T> f) creates an infinite Stream from iterative application of a function f to an initial element seed.
Bu metod recursive (özyinelemeli veya kendi kendini çağıran) metodların veya döngülerin metodların yerine geçebilir. Bu metod sonsıuz bir Stream yarattığı için limit() ile sınırlandırmak gerekir.

Örnek
Şöyle yaparız.
DoubleStream.iterate(1.0,term -> term*2)
            .limit(n).sum();
Örnek
Şöyle yaparız.
Stream.iterate('a', i -> (char)(i + 1)).limit(26).forEach(System.out::println);
iterate metodu - seed + predicate + unary operator
İmzası şöyle. Predicate ile sınırlanan bir Stream yaratır.
public static<T> Stream<T> iterate(T seed, Predicate<? super T> hasNext, 
  UnaryOperator<T> next)
Java 9 ile geliyor. Belirtilen seed değerinden başlar ve predicate true olduğu müddetçe unary operator ile seed değeri değiştirilir.
Örnek
Şöyle yaparız.
Stream.iterate(exception, Objects::nonNull, Throwable::getCause);
Şu kod ile aynıdır.
Stream.iterate(exception, Throwable::getCause)
      .takeWhile(Objects::nonNull)
Örnek
Belirtilen karakterlerin String içindeki indeksini bulmak için şöyle yaparız.
List<Integer> getIndexList(String word, char c) {
  return IntStream
    .iterate(word.indexOf(c),
             index -> index >= 0,//Predicate
             index -> word.indexOf(c, index + 1))
    .boxed()
    .collect(Collectors.toList());
}

Hiç yorum yok:

Yorum Gönder