24 Haziran 2018 Pazar

Java 8 Stream Sınıfı Filtre Metodları

distinct metodu
Strem nesnesi döner. Eğer stream zaten sorted ise distinct() bir önceki eleman ile karşılaştırma yapar, sorted değilse kendi içinde HashSet kullanır, bu yüzden sıra bozulabilir. Açıklaması şöyle.
For ordered streams, the selection of distinct elements is stable (for duplicated elements, the element appearing first in the encounter order is preserved.) For unordered streams, no stability guarantees are made.
Dolayısıyla normal stream'lerde önce sorted() sonra distinct() çağrılırsa daha iyi sonuç elde edilebilir. Paralel stream'lerde ise sıra çok öenmli olmadığı için önce distinct() sonra sorted() çağrılır.

Örnek
Elimizde bir string olsun.
String str = "...";
İngilizcedeki tüm harflerin olup olmadığını öğrenmek için şöyle yaparız.
str.chars()
  .filter(i -> i >= 'a' && i <= 'z').distinct().count() == 26;
filter metodu
Parametre olarak bir Predicate alır. Predicate girdi olarak bir parametre alır ve boolean bir sonuç döner. filter true dönen elemanları saklar. Bu yüzden ismi belki accept olsaydı daha iyi olabilirdi.
Örnek
Elemenları süzmek için şöyle yaparız .
List<Integer> list = new ArrayList<Integer>();
list.add(3);
list.add(5);
list.add(4);
list.add(2);
list.add(5);
list = list.stream().filter(i -> i >= 3).collect(Collectors.toList());
Örnek
filtre içinde ArraList'i değiştirmek doğru değil. Şu kod exception fırlatır.
List<Integer> x = new ArrayList<>(Arrays.asList(1, 11, 21));
x.stream().filter(i -> {
                  if (i < 10) {
                      x.remove(i); 
                      return false;
                  }
                  return true;
}).forEach(System.out::println);
Bu durumda listenin kendi removeIf metodunu kullanmak daha iyi. Şöyle yaparız.
x.removeIf(i -> i < 10);
x.forEach(System.out::println);

Hiç yorum yok:

Yorum Gönder