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")); // GermanyYinelenen 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.COMtoUnmodifiableMap
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 UnsupportedOperationExceptionCollectors.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.0summingInt 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.0summarizingInt 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")); // 5432Hı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
- groupingBy: Öğeleri Sınıflandırma
- partitioningBy ve counting
- toMap, joining ve summarizing
- Özel Bir Toplayıcı Oluşturma