16 Aralık 2018 Pazar

Stream sorted metodu - Stream'i Sıralar

Giriş
sorted() metodunun iki tane overload edilmiş hali var.
1. Natural Order'a göre sıralayan. Elemanların Comparable olması gerekir.
2. Parametre olarak Comparator alan

sorted metodu
İmzası şöyle
Stream<T> sorted();
Açıklaması şöyle.
Returns a stream consisting of the elements of this stream, sorted according to natural order. If the elements of this stream are not Comparable, a java.lang.ClassCastException may be thrown when the terminal operation is executed.
Örnek
sorted() ile çağrılan nesnenin Comparable olması gerekir. Yoksa şu exception fırlatılır.
Exception in thread "main" java.lang.ClassCastException:
 Foo cannot be cast to java.lang.Comparable
Örnek
Şöyle yaparız.
final List<Integer> list = IntStream.range(0, 10).boxed().collect(Collectors.toList());

list.stream()
    .filter(i -> i > 5)
    .sorted()
    .forEach(list::remove);

System.out.println(list);            // Prints [0, 1, 2, 3, 4, 5]
Örnek
Elimizde şöyle bir Map olsun.
Map<Long, Test> map = new HashMap<Long, Test>(); 
Test sınıfının en büyük number alanına sahip olanını bulmak için şöyle yaparız.
Entry<Long, Test> entry = map.entrySet()
  .stream()
  .sorted(Map.Entry.comparingByValue(Comparator.comparing(Test::getNumber,
    Comparator.reverseOrder())))
  .findFirst()
  .get();
Diğer
sorted() metodu orijinal veriyapısı üzerinde çalışabilir veya çalışmayabilir. Bu konuda bir garanti verilmiyor. Dolayısıyla şu açıklama doğru değil.
The sorted() operation is a “stateful intermediate operation”, which means that subsequent operations no longer operate on the backing collection, but on an internal state.
Örnek
Aşağıdaki kod ConcurrentModificationException fırlatır.
Set<Integer> set = IntStream.range(0, 10).boxed()
    .collect(Collectors.toCollection(TreeSet::new));
set.stream()
    .filter(i -> i > 5)
    .sorted()
    .forEach(set::remove);
sorted metodu - Comparator
Örnek
Şöyle yaparız
Stream<String> stream = stringCollection.stream().sorted(Comparator.naturalOrder());
Örnek
Elimizde şöyle bir kod olsun
List<String> list = Arrays.asList("SOmE", "StriNgs", "fRom", "mE", "To", "yOU");
Şöyle yaparız.
list.stream()
     .map(n -> n.toLowerCase())
     .sorted(Comparator.comparingInt(String::length))
     .map(s -> Character.toUpperCase(s.charAt(0)) + s.substring(1))
     .forEachOrdered(n -> System.out.println(n));
Açıklaması şöyle.
Keep in mind that forEach makes no ordering guaranties, so to be sure to see the elements in the sorted order, you have to use forEachOrdered

Hiç yorum yok:

Yorum Gönder