Java 12 Yenilikleri (2019)
Java 12, dil ergonomisini iyileştiren önizleme özellikleri ve pratik kütüphane eklemeleri getirdi. En önemlisi, sonraki sürümlerde standartlaşacak switch ifadeleridir (switch expressions); ayrıca yeni String metotları…
Java 12 Yenilikleri (2019)
Java 12, dil ergonomisini iyileştiren önizleme özellikleri ve pratik kütüphane eklemeleri getirdi.
En önemlisi, sonraki sürümlerde standartlaşacak switch ifadeleridir (switch expressions);
ayrıca yeni String metotları, Collectors.teeing ve kompakt sayı biçimlendirme eklendi.
switch ifadeleri (switch expression)
Klasik switch bir deyimdi (statement): break gerektirir, fall-through tuzağı vardır,
değer döndürmez. Java 12, switch'i bir ifadeye (expression) dönüştürdü — değer döndürür,
break yok, çoklu etiket tek satırda:
String tip = switch (gun) { case 1, 2, 3, 4, 5 -> "hafta içi"; case 6, 7 -> "hafta sonu"; default -> "geçersiz"; };
-> (ok) söz dizimi fall-through'ı ve break gürültüsünü ortadan kaldırır; derleyici tüm
durumların ele alındığını (eksiksizlik) denetler. Bu özellik Java 12-13'te önizleme, Java 14'te
standart oldu (JDK 21'de tam çalışır). Örnek 1 (./Ornek1.java) bunu ve aşağıdaki String
metotlarını gösterir.
Yeni String metotları
indent(n): Çok satırlı metnin her satırınınboşluk girintiler.transform(fn): Metne bir fonksiyon uygulayıp sonucu döndürür — akıcı dönüşüm zinciri kurar (s.transform(String::strip).transform(String::toUpperCase)).
Collectors.teeing
Çok kullanışlı bir toplayıcı: aynı stream'i iki toplayıcıdan geçirip sonuçları bir fonksiyonla birleştirir — tek geçişte iki istatistik:
stream.collect(Collectors.teeing( Collectors.averagingInt(...), // ortalama Collectors.counting(), // adet (ort, adet) -> new Sonuc(ort, adet)));
Min+max, toplam+adet, ortalama+sapma gibi "ikili" hesaplamalar için idealdir. Örnek 2
(./Ornek2.java) ortalama+adet ve min+max örnekleri gösterir.
Kompakt sayı biçimlendirme
NumberFormat.getCompactNumberInstance, büyük sayıları kısa ve yerelleştirilmiş gösterir:
NumberFormat.getCompactNumberInstance(locale, Style.SHORT).format(1_500_000); // "1,5Mn" gibi
Gösterge panelleri (dashboard), sosyal medya sayaçları (12B beğeni) gibi UI senaryolarında çok kullanışlıdır.
Özet
Java 12'nin yeniliklerini öğrendik: sonradan standartlaşacak switch ifadeleri ve String.indent/
transform (Örnek 1); tek geçişte ikili istatistik için Collectors.teeing ve kompakt sayı
biçimlendirme (Örnek 2). Sırada, çok satırlı metnin dertten kurtulduğu sürüm: Java 13 ve text
blocks.
▶ Kod Örnekleri(2)
Ornek1
çalıştırılabilir1// Ornek1: Java 12 — switch ifadeleri (ok söz dizimi) ve yeni String metotları.
2// (switch expression Java 12'de önizleme, Java 14'te standart oldu; JDK 21'de çalışır.)
3// Çalıştırma: java Ornek1.java
4public class Ornek1 {
5
6 public static void main(String[] args) {
7 // switch EXPRESSION: ok (->) söz dizimi, değer DÖNDÜRÜR, break yok, fall-through yok.
8 for (int gun = 1; gun <= 7; gun++) {
9 String tip = switch (gun) {
10 case 1, 2, 3, 4, 5 -> "hafta içi"; // çoklu etiket tek satırda
11 case 6, 7 -> "hafta sonu";
12 default -> "geçersiz";
13 };
14 System.out.println(gun + " -> " + tip);
15 }
16
17 // String.indent(n): her satırı n boşluk girintile
18 String metin = "satir1\nsatir2";
19 System.out.println("\nindent(4):\n" + metin.indent(4));
20
21 // String.transform(fn): metne bir fonksiyon uygula (akıcı dönüşüm)
22 String sonuc = " merhaba dünya "
23 .transform(String::strip)
24 .transform(String::toUpperCase)
25 .transform(s -> s.replace(" ", "_"));
26 System.out.println("transform zinciri: " + sonuc);
27
28 System.out.println("""
29
30 --- Java 12: switch ifadesi + String metotları ---
31 switch expression: 'case X ->' ile değer döndürür; break/fall-through derdi yoktur,
32 çoklu etiket (case 1,2,3) tek satırda yazılır, eksiksizlik denetlenir.
33 String.indent(n): çok satırlı metni topluca girintiler.
34 String.transform(fn): metne fonksiyon uygulayıp sonucu döndürür (akıcı dönüşüm zinciri).""");
35 }
36}Ornek2
çalıştırılabilir1// Ornek2: Java 12 — Collectors.teeing ve kompakt sayı biçimlendirme.
2// Çalıştırma: java Ornek2.java
3import java.text.NumberFormat;
4import java.util.List;
5import java.util.Locale;
6import java.util.stream.Collectors;
7
8public class Ornek2 {
9
10 record IstatistikSonucu(double ortalama, long adet) {}
11
12 public static void main(String[] args) {
13 List<Integer> notlar = List.of(70, 85, 90, 60, 95, 80);
14
15 // Collectors.teeing: aynı stream'i İKİ toplayıcıya verip sonuçları birleştirir.
16 IstatistikSonucu sonuc = notlar.stream().collect(Collectors.teeing(
17 Collectors.averagingInt(Integer::intValue), // 1. toplayıcı: ortalama
18 Collectors.counting(), // 2. toplayıcı: adet
19 IstatistikSonucu::new // ikisini birleştir
20 ));
21 System.out.printf("teeing -> ortalama=%.1f, adet=%d%n", sonuc.ortalama(), sonuc.adet());
22
23 // Min ve max'ı tek geçişte teeing ile:
24 var aralik = notlar.stream().collect(Collectors.teeing(
25 Collectors.minBy(Integer::compareTo),
26 Collectors.maxBy(Integer::compareTo),
27 (min, max) -> min.get() + ".." + max.get()));
28 System.out.println("teeing min..max: " + aralik);
29
30 // Kompakt sayı biçimlendirme (Java 12): 1000 -> "1B", 1_000_000 -> "1Mn" (locale'e göre).
31 NumberFormat kisa = NumberFormat.getCompactNumberInstance(new Locale("tr"), NumberFormat.Style.SHORT);
32 System.out.println("\nKompakt sayı:");
33 for (long n : new long[]{999, 1_500, 25_000, 3_200_000}) {
34 System.out.println(" " + n + " -> " + kisa.format(n));
35 }
36
37 System.out.println("""
38
39 --- Java 12: Collectors.teeing + kompakt sayı ---
40 Collectors.teeing(c1, c2, birlestir): aynı stream'i iki toplayıcıdan geçirip sonuçları birleştirir
41 (tek geçişte ortalama+adet, min+max gibi). Çift istatistik için çok kullanışlı.
42 getCompactNumberInstance: büyük sayıları kısa gösterir (1.5B, 25B, 3,2Mn) — UI'da idealdir.""");
43 }
44}