15 Mart 2020 Pazar

Stream limit metodu

Giriş
Açıklaması şöyle.
An intermediate operation is short-circuiting if, when presented with infinite input, it may produce a finite stream as a result. A terminal operation is short-circuiting if, when presented with infinite input, it may terminate in finite time.
- Limit belirtilen sayıya kadar çalışır. Eğer Stream daha az sayı üretiyorsa bu sayıyı bekleyeceği için stream takılabilir.

- Paralel Strem'lerde limit metodu pahalı bir işlem olaiblir. Açıklaması şöyle.
API Note: While limit() is generally a cheap operation on sequential stream pipelines, it can be quite expensive on ordered parallel pipelines, especially for large values of maxSize...

Örnek
Şöyle yaparız.
String[] limit = Stream.generate(() -> "test") // returns an infinite stream
                       .limit(20)
                       .toArray(String[]::new);
Örnek - Takılma Durumu
Bu örnekte 10 taneden az sayı üretildiği için kod takılıyor.
List<Integer> integer = Stream.generate(new Supplier<Integer>() {
    int i = 0 ;

    @Override
    public Integer get() {
        return ++i;
    }
}).filter(j -> j < 5).limit(10).collect(Collectors.toList());
Örnek - Limit Sayısını Dinamik Hesaplama
Şöyle yaparız
.limit(maxNumber == 0 ? Long.MAX_VALUE : maxNumber)
Örnek - Limit Metodunu Dinamik Kullanma
Şöyle yaparız
final Stream stream = list.stream()
        .sorted(comparator);

if (maxLimit > 0) {
  stream = stream.limit(maxLimit);
}

return stream.collect(Collectors.toList());
skip metodu İle Farkı
skip () ve limit birbirine ters metodlar. Birisi baştaki eleman sayısını sınırlar, diğeri ise baştaki elemanları atlar.
Eğer stream'den belli sayıda elemanı atlamak istersek şöyle bir yardımcı metod kullanabiliriz.
public static <T> void skip(Stream<T> stream, int n) {
    stream.limit(n).forEach(t -> {});
}

Hiç yorum yok:

Yorum Gönder