12 Haziran 2020 Cuma

Comparator.comparing metodu - Sınıfın Alanına Göre Sıralama İçindir

Giriş
Bu metodun iki tane overload edilmiş hali var.

- Birinci halinde sadece keyExtractor kullanılıyor. Bu çağrının döndürdüğü key nesnesinin Comparable olduğu varsayılır.

- İkinci halinde sadece keyExtractor + keyComparator kullanılıyor. Bu çağrının döndürdüğü key nesnesinin Comparable olmadığı için ikinci parametre olan keyComparator kullanılıyor

Eksiklik
Comparator.comparing() + thenComparing() kullanımında hangi alandan dolayı eşitsizlik olduğunu görmek yolu yok. Elimizde şöyle bir kod olsun. Burada hangi alanın farklı olduğunu göremiyoruz, elimize sadece sonuç geçiyor 
int result =
Comparator.comparing(Employee::getName, Comparator.nullsFirst(Comparator.naturalOrder())) .thenComparing(Employee::getAge, Comparator.nullsFirst(Comparator.naturalOrder())) .thenComparing(Employee::isFullTime,Comparator.nullsFirst(Comparator.naturalOrder())) .compare(emp1, emp2);
comparing metodu - keyExtractor
Static factory metodudur. Normalde küçükten büyüğe sıralama sağlar.
Örnek
Hem nesne null hem de üye alan null olabiliyorsa ve null olanları en sona almak istiyorsak şöyle yaparız
//Compare by getExpirationDate(), sort  null ExpirationDate as last
Comparator<Foo> propertyComparator = Comparator.comparing(Foo::getExpirationDate, 
  Comparator.nullsLast(Comparator.naturalOrder()));

//Compare by object, sort null objects as last
Comparator<Foo> comparator = Comparator.nullsLast(propertyComparator);
Örnek
Büyükten küçüğe sıralama için şöyle yaparız.
employeeList.sort(Comparator.comparing(Employee::getExperience).reversed());
Örnek
Her iki alana göre sıralı olup olmadığını bulmak için şöyle yaparız.
<T, R extends Comparable<? super R>> boolean isSorted(List<T> list, Function<T, R> f) {
  Comparator<T> comp = Comparator.comparing(f);
  for (int i = 0; i < list.size() - 1; ++i) {
    T left = list.get(i);
    T right = list.get(i + 1);
    if (comp.compare(left, right) >= 0) {
      return false;
    }
  }

  return true;
}
Kullanmak için şöyle yaparız.
System.out.println(
          isSorted(myList, MyObj::getPercentage) && 
          isSorted(myList, MyObj::getDate));
comparing metodu - keyExtractor + keyComparator
Static factory metodudur. key'leri ürettikten sonra, keyComparator metodunu çağırır.
Örnek
Ters dizmek için şöyle yaparız.
Comparator.comparing(Test::getNumber, Comparator.reverseOrder());
Örnek
null değerlerin önce gelmesini istersek şöyle yaparız.
Comparator.comparing(Person::getName,
 Comparator.nullsFirst(String.CASE_INSENSITIVE_ORDER))
Çıktı olarak şunu alırız.
null
Alice
Bob
Bob
Carol
Carol
David
Eric
Örnek
poNumber alanına göre küçükten büyüğe sıralamak için şöyle yaparız. Alan null ise en öne gelir. Eğer iki alanın değerş aynı ise created alanına göre sıralama yapar.
import static java.util.Comparator.*; // for the sake of brevity

Set<Photo> orderedPhotos = new TreeSet<>(
    Comparator.comparing(Photo::getPoNumber, nullsFirst(naturalOrder()))
              .thenComparing(Photo::getCreated));

Hiç yorum yok:

Yorum Gönder