sorted etiketine sahip kayıtlar gösteriliyor. Tüm kayıtları göster
sorted etiketine sahip kayıtlar gösteriliyor. Tüm kayıtları göster

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