0Pricing
Java Academy · Ders

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 alphabetically

reversed()

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.0

Lambda İ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" first

Product 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

  1. Comparable Arayüzü
  2. Comparator ve Lambda ile Sıralama
  3. thenComparing ile Çok Anahtarlı Sıralama
  4. Dizileri ve Koleksiyonları Uygulamada Sıralama
← Java Academy Sayfasına Dön