Comparator ve Lambda ile Sıralama
Lambda ifadeleri ve Comparator.comparing fabrika yöntemleriyle Comparator örnekleri oluşturun.
Comparator ve Lambda ile Sıralama, CoddyKit'te ücretsiz bir Java Academy dersidir. Bu, 4 dersinin 2. dersidir. Aşağıdan dersin tamamını ücretsiz okuyabilir, sonra tarayıcıda yerleşik kod editörü ve 7/24 yapay zeka koçu ile uygulamalı olarak pratik yapabilirsin. Bu, Java Academy öğrenme yolunun bir parçasıdır ve ilerlemeniz web ve CoddyKit uygulaması arasında senkronize olur. Java Academy kursu toplamda 4 dersten oluşur.
Comparator ve Lambda Sıralaması
Comparator<T>, nesneler için dışarıdan bir sıralama tanımlar. Comparable'ın aksine, sınıfı değiştirmeden gerektiği kadar Comparator oluşturabilirsiniz.
Comparator Oluşturma
Bir lambda ifadesi veya yöntem başvurusu ile Comparator oluşturun ve bunu sıralama yöntemlerine aktarın.
import java.util.*;
record Product(String name, double price, int stock) {}
List<Product> products = new ArrayList<>(List.of(
new Product("Mouse", 29.99, 50),
new Product("Laptop", 999.00, 5),
new Product("USB Hub", 24.99, 100)
));
// Lambda comparator
products.sort((a, b) -> Double.compare(a.price(), b.price()));
System.out.println(products);
// [USB Hub, Mouse, Laptop] (by price ascending)Comparator.comparing Üreticisi
Comparator.comparing(keyExtractor), bir anahtar çıkarma işlevinden Comparator oluşturur; ham lambda ifadelerinden daha temizdir.
import java.util.Comparator;
Comparator<Product> byPrice = Comparator.comparingDouble(Product::price);
Comparator<Product> byName = Comparator.comparing(Product::name);
Comparator<Product> byStock = Comparator.comparingInt(Product::stock);
products.sort(byPrice);
System.out.println(products); // sorted by price ascending
products.sort(byName);
System.out.println(products); // sorted alphabeticallyreversed()
reversed(), herhangi bir Comparator'ın sırasını tersine çevirir.
import java.util.Comparator;
Comparator<Product> mostExpensiveFirst =
Comparator.comparingDouble(Product::price).reversed();
products.sort(mostExpensiveFirst);
System.out.println(products);
// [Laptop($999.0), Mouse($29.99), USB Hub($24.99)]naturalOrder ve reverseOrder
Comparator.naturalOrder(), sınıfın Comparable'ını kullanır. reverseOrder() ise bu sırayı tersine çevirir.
List<String> names = new ArrayList<>(List.of("Charlie", "Alice", "Bob"));
names.sort(Comparator.naturalOrder());
System.out.println(names); // [Alice, Bob, Charlie]
names.sort(Comparator.reverseOrder());
System.out.println(names); // [Charlie, Bob, Alice]
// Sort integers descending
List<Integer> nums = new ArrayList<>(List.of(5, 2, 8, 1, 9));
nums.sort(Comparator.reverseOrder());
System.out.println(nums); // [9, 8, 5, 2, 1]Null Güvenli Comparator'lar
Comparator.nullsFirst() ve nullsLast(), null öğeleri NPE oluşturmadan işler.
import java.util.*;
List<String> withNulls = new ArrayList<>(Arrays.asList("Charlie", null, "Alice", null, "Bob"));
withNulls.sort(Comparator.nullsLast(Comparator.naturalOrder()));
System.out.println(withNulls); // [Alice, Bob, Charlie, null, null]
withNulls.sort(Comparator.nullsFirst(Comparator.naturalOrder()));
System.out.println(withNulls); // [null, null, Alice, Bob, Charlie]Comparator ile Akış sorted() İşlemi
İşlevsel tarzda sıralama yapmak için bir Comparator ile sorted() ara akış işlemini kullanın.
import java.util.stream.*;
record Employee(String name, String dept, double salary) {}
List<Employee> employees = List.of(
new Employee("Alice", "Engineering", 95000),
new Employee("Bob", "Marketing", 72000),
new Employee("Charlie", "Engineering", 105000)
);
// Sort by salary descending in a stream pipeline
employees.stream()
.sorted(Comparator.comparingDouble(Employee::salary).reversed())
.forEach(e -> System.out.println(e.name() + ": $" + e.salary()));
// Charlie: $105000.0 / Alice: $95000.0 / Bob: $72000.0Lambda İfadesi ve Yöntem Başvurusu Olarak Comparator
Anahtar çıkarıcı basit bir erişim yöntemi olduğunda, yöntem başvuruları Comparator'ları daha da kısa hâle getirir.
// Lambda
Comparator<String> c1 = (a, b) -> a.length() - b.length();
// Comparator.comparing with lambda
Comparator<String> c2 = Comparator.comparing(s -> s.length());
// Comparator.comparingInt with method reference (cleanest)
Comparator<String> c3 = Comparator.comparingInt(String::length);
List<String> words = new ArrayList<>(List.of("banana", "fig", "apple", "kiwi"));
words.sort(c3);
System.out.println(words); // [fig, kiwi, apple, banana]Durum Tutan Comparator
Comparator'lar genellikle durum bilgisi tutmamalı olsa da kurucu parametreleri aracılığıyla yapılandırma aktarabilirsiniz.
class DistanceComparator implements Comparator<String> {
private final String target;
DistanceComparator(String target) { this.target = target; }
@Override
public int compare(String a, String b) {
return Integer.compare(distance(a), distance(b));
}
private int distance(String s) { return Math.abs(s.length() - target.length()); }
}
List<String> words = new ArrayList<>(List.of("Java", "Go", "Python", "C", "Kotlin"));
words.sort(new DistanceComparator("Java"));
System.out.println(words); // closest length to "Java" firstProduct Kataloğu için Özel Sıralama
Bir ürün kataloğunu önce kullanılabilirliğe, sonra fiyata, ardından ada göre sıralama.
import java.util.*;
record Item(String name, double price, boolean inStock) {}
List<Item> catalog = List.of(
new Item("Laptop", 999.0, true),
new Item("Case", 19.99, false),
new Item("Mouse", 29.99, true),
new Item("Monitor", 349.0, true)
);
Comparator<Item> catalogSort =
Comparator.comparing(Item::inStock).reversed() // in-stock first
.thenComparingDouble(Item::price) // then cheapest
.thenComparing(Item::name); // then alphabetical
catalog.stream().sorted(catalogSort)
.forEach(i -> System.out.printf("%s %-15s $%.2f%n",
i.inStock() ? "[Y]" : "[N]", i.name(), i.price()));Comparator ile Arrays.sort
Arrays.sort(array, comparator), nesne dizilerini özel bir Comparator ile sıralar.
String[] words = {"banana", "fig", "apple", "kiwi", "cherry"};
// Sort by length, then alphabetically for same length
Arrays.sort(words,
Comparator.comparingInt(String::length)
.thenComparing(Comparator.naturalOrder()));
System.out.println(Arrays.toString(words));
// [fig, kiwi, apple, banana, cherry]Hızlı Denetim
Comparator.comparingDouble(Product::price).reversed() ne üretir?
Özet: Comparator ve Lambda Sıralaması
Temel çıkarımlar:
- Comparator<T>, dışarıdan bir sıralama tanımlar; gerektiği kadar kullanabilirsiniz
- Comparator.comparing(keyExtractor), erişim yöntemlerinden Comparator oluşturur
- reversed(), herhangi bir Comparator'ın sırasını tersine çevirir; Comparable türleri için naturalOrder()/reverseOrder() kullanılır
- nullsFirst() ve nullsLast(), null öğeleri güvenle işler
- İşlevsel tarzda sıralama için Akış işlem hatlarında sorted(comparator) kullanın
- Comparator'lar sort(), Arrays.sort(), TreeSet ve TreeMap'e aktarılabilir
Sıkça Sorulan Sorular
“Comparator ve Lambda ile Sıralama” dersi ücretsiz mi?
Evet — “Comparator ve Lambda ile Sıralama” dersin tüm metni burada web'de ücretsiz olarak okunabilir. Etkileşimli olarak pratik yapmak (yerleşik kod editörü ve 7/24 yapay zeka koçu) ve Java Academy kursunun geri kalanını açmak için CoddyKit PRO'ya yükselt. Java Academy kursu toplamda 4 dersten oluşur.
“Comparator ve Lambda ile Sıralama” dersinde ne öğreneceğim?
Lambda ifadeleri ve Comparator.comparing fabrika yöntemleriyle Comparator örnekleri oluşturun. Java Academy ile uygulamalı kodu tarayıcıda doğrudan çalıştırarak pratik yaparsın ve 7/24 yapay zeka koçu dersi çalışırken sorularını yanıtlar.
Java Academy öğrenmeye başlamak için deneyim gerekli mi?
Önceden deneyim gerekmez. CoddyKit'te Java Academy, başlangıçtan ileri seviyeye kadar yapılandırıldığı için buradan başlayabilir veya başından başlayıp kendi hızında ilerleme yapabilirsin. Bu, 4 dersinin 2. dersidir.
“Comparator ve Lambda ile Sıralama” dersi ne kadar sürer?
Çoğu CoddyKit dersi yaklaşık 5–10 dakika sürer. Her biri kısa ve etkileşimli olduğu için sabit ilerleme yaparsın ve web ile uygulama arasında tam olarak bıraktığın yerden devam edebilirsin.
Bu Java Academy dersinde kod yazıp çalıştırabilir miyim?
Evet. Her Java Academy dersi yerleşik bir kod editörü içerir, bu sayede tarayıcıda gerçek kod yazıp çalıştırabilir ve anlık yapay zeka geri bildirimi alırsın — yerel kurulum gerekli değildir.
Bu kursun tüm dersleri
- Comparable Arayüzü
- Comparator ve Lambda ile Sıralama
- thenComparing ile Çok Anahtarlı Sıralama
- Dizileri ve Koleksiyonları Uygulamada Sıralama