11 Eylül 2017 Pazartesi

Stream Search Metodları

findAny metodu
Optional döner. findAny ve findFirst arasında fark yoktur. Fark parallelleştirmede ortaya çıkar. Paralel kodlarda findFirst() ilk elemanı dönerken findAny() herhangi bir elemanı dönebilir.

Örnek
Şöyle yaparız.
list.stream()
  .filter(e -> ...)
  .findAny()
  .orElseGet(() -> {
    return ...;
});
Örnek
Şöyle yaparız.
Optional<Something> s = list.stream()
  .filter(ele -> ele.isBlue())
  .map(Element::getSomething)
  .findAny();
findFirst metodu
findFirst() bir Optional döner ve stream'in akmasını durdurur.

Stream genelde önce filtre'ye tabi tutulur. Daha sonra findFirst() çağrılır.  Eğer eleman varsa akımdaki ilk elemanı verir.  Optional içinde elemana ulaşmak için get() çağrılır.
Örnek
Eğer filtre kullanmazsak findFirst() iterator ile aynıdır. Şu kod aynı değeri döndürür.
HashMap<String, String> map = ...
...
Map.Entry<String, String> entry1 = set.iterator().next();
Map.Entry<String, String> entry2 = set.stream().findFirst().get();
Örnek
Şöyle yaparız
System.out.println(
            "Result: " +
            Stream.of(1, 2, 3)
                    .filter(i -> {
                        System.out.println(i);
                        return true;
                    })
                    .findFirst()
                    .get()
    );
Örnek
findFirst() sonucu içinde eleman varsa, bu eleman ile bir işlem yapmak için ifPresent kullanılabilir.
IntStream.iterate(0, playerCount)
             .map(PigDice::turn)
             .filter(player -> player > -1)
             .findFirst()
             .ifPresent(
                player ->...);
Örnek
Eğer findFirst() sonucu içinde eleman yoksa, orElse() ile bir başka eleman dönmesi sağlanır.
public static <T> T coalesce(Supplier<T>... ts) {
    return asList(ts)
        .stream()
        .map(t -> t.get())
        .filter(t -> t != null)
        .findFirst()
        .orElse(null);
}

Hiç yorum yok:

Yorum Gönder