0Pricing
Java Academy · Ders

toMap, joining ve summarizing

Akışları haritalara dönüştürün, joining ile dizeleri birleştirin ve summarizingInt ile istatistikleri hesaplayın.

toMap, joining ve summarizing, CoddyKit'te ücretsiz bir Java Academy dersidir. Bu, 4 dersinin 3. 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.

Collectors.toMap Temelleri

Collectors.toMap(keyMapper, valueMapper), bir stream'i Map'e dönüştürür. Her öğe bir anahtar-değer çifti sağlar.

import java.util.*;
import java.util.stream.*;

record Country(String code, String name) {}
List<Country> countries = List.of(
    new Country("US","United States"),
    new Country("DE","Germany"),
    new Country("JP","Japan")
);

Map<String, String> codeToName =
    countries.stream().collect(
        Collectors.toMap(Country::code, Country::name)
    );
System.out.println(codeToName.get("DE")); // Germany

Yinelenen Anahtarları Ele Alma

toMap, yinelenen anahtarlar bulunduğunda IllegalStateException fırlatır. Çakışmaları çözmek için üçüncü bağımsız değişken olarak bir birleştirme işlevi sağlayın:

List<String> words = List.of("apple","ant","banana","bat","cherry");

Map<Character, String> firstByLetter =
    words.stream().collect(
        Collectors.toMap(
            w -> w.charAt(0),
            w -> w,
            (existing, replacement) -> existing // keep first
        )
    );
System.out.println(firstByLetter); // {a=apple, b=banana, c=cherry}

Değer Dönüştürmeyle toMap

Değer eşleyici herhangi bir işlev olabilir; öğeyi depolamadan önce dönüştürün:

record User(String login, String email) {}
List<User> users = List.of(
    new User("alice","alice@example.com"),
    new User("bob","bob@example.com")
);

Map<String, String> loginToEmail =
    users.stream().collect(
        Collectors.toMap(User::login, u -> u.email().toUpperCase())
    );
System.out.println(loginToEmail.get("alice")); // ALICE@EXAMPLE.COM

toUnmodifiableMap

Değişmez bir eşlem üretmek için Collectors.toUnmodifiableMap() kullanın. Bu, Collections.unmodifiableMap() ile sarmalamaya eşdeğerdir ancak daha temizdir:

Map<String, Integer> wordLengths =
    Stream.of("Java","Stream","API")
          .collect(Collectors.toUnmodifiableMap(w -> w, String::length));
// wordLengths.put("test",4); // throws UnsupportedOperationException

Collectors.joining

Collectors.joining(), metin öğelerini birleştirir. İsteğe bağlı ayraç, ön ek ve son ek kabul eder:

List<String> names = List.of("Alice","Bob","Carol");

System.out.println(names.stream().collect(Collectors.joining()));
// AliceBobCarol

System.out.println(names.stream().collect(Collectors.joining(", ")));
// Alice, Bob, Carol

System.out.println(names.stream().collect(Collectors.joining(", ", "[", "]")));
// [Alice, Bob, Carol]

CSV Çıktısı için joining

joining ile CSV satırları veya SQL IN cümleleri oluşturun:

List<Integer> ids = List.of(1,2,3,4,5);

String inClause = ids.stream()
    .map(Object::toString)
    .collect(Collectors.joining(",", "(", ")"));
System.out.println("WHERE id IN " + inClause);
// WHERE id IN (1,2,3,4,5)

summarizingInt / Long / Double

Collectors.summarizingInt(), tüm istatistikleri tek geçişte hesaplar ve bir IntSummaryStatistics döndürür:

record Product(String name, int price) {}
List<Product> products = List.of(
    new Product("A",100), new Product("B",200), new Product("C",150)
);

IntSummaryStatistics stats =
    products.stream().collect(Collectors.summarizingInt(Product::price));

System.out.println("Count: " + stats.getCount());   // 3
System.out.println("Sum: "   + stats.getSum());     // 450
System.out.println("Min: "   + stats.getMin());     // 100
System.out.println("Max: "   + stats.getMax());     // 200
System.out.println("Avg: "   + stats.getAverage()); // 150.0

summingInt ve averagingInt

Yalnızca tek bir istatistiğe ihtiyaç duyduğunuz daha basit durumlar için:

int total = products.stream().collect(Collectors.summingInt(Product::price));
System.out.println("Total: " + total); // 450

double avg = products.stream().collect(Collectors.averagingInt(Product::price));
System.out.println("Average: " + avg); // 150.0

summarizingInt ile groupingBy

Her grup için özetleme işlemini birleştirin:

record Sale(String region, int amount) {}
List<Sale> sales = List.of(
    new Sale("North",100), new Sale("South",200),
    new Sale("North",150), new Sale("South",300)
);

Map<String, IntSummaryStatistics> statsByRegion =
    sales.stream().collect(
        Collectors.groupingBy(Sale::region,
            Collectors.summarizingInt(Sale::amount))
    );
statsByRegion.forEach((r,s) ->
    System.out.printf("%s: sum=%d avg=%.1f%n", r, s.getSum(), s.getAverage()));

LinkedHashMap'e Toplama

Varsayılan olarak toMap bir HashMap üretir (sırasız). Eklenme sırasını koruyan bir LinkedHashMap belirtmek için 4 bağımsız değişkenli aşırı yüklenmiş sürümü kullanın:

Map<String, Integer> ordered =
    Stream.of("banana","apple","cherry")
          .collect(Collectors.toMap(
              w -> w,
              String::length,
              (a,b) -> a,
              LinkedHashMap::new
          ));
System.out.println(ordered.keySet()); // [banana, apple, cherry]

Uygulama: Yapılandırma Ayrıştırıcısı

toMap ile anahtar=değer satırlarını ayrıştırarak bir eşleme oluşturun:

List<String> lines = List.of("host=localhost","port=5432","db=myapp");

Map<String, String> config =
    lines.stream()
         .map(l -> l.split("=", 2))
         .collect(Collectors.toMap(a -> a[0], a -> a[1]));

System.out.println(config.get("port")); // 5432

Hızlı Kontrol

Aynı anahtara sahip iki öğe içeren bir stream üzerinde Collectors.toMap(k, v) kullanıyorsunuz. Ne olur?

Özet: toMap, joining, summarizing

Temel çıkarımlar:

  • toMap(keyMapper, valueMapper) — birleştirme işlevi olmadan yinelenen anahtarlarda hata fırlatır
  • joining(delimiter, prefix, suffix) — metinleri zarif bir şekilde birleştirir
  • summarizingInt, tek geçişte count+sum+min+max+avg değerlerini sağlar
  • Tek istatistik gereksinimleri için summingInt/averagingInt kullanın
  • Sıralı sonuçlar için LinkedHashMap::new ile 4 bağımsız değişkenli toMap kullanın

Sıkça Sorulan Sorular

“toMap, joining ve summarizing” dersi ücretsiz mi?

Evet — “toMap, joining ve summarizing” 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.

“toMap, joining ve summarizing” dersinde ne öğreneceğim?

Akışları haritalara dönüştürün, joining ile dizeleri birleştirin ve summarizingInt ile istatistikleri hesaplayın. 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 3. dersidir.

“toMap, joining ve summarizing” 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. groupingBy: Öğeleri Sınıflandırma
  2. partitioningBy ve counting
  3. toMap, joining ve summarizing
  4. Özel Bir Toplayıcı Oluşturma
← Java Academy Sayfasına Dön