Eğitim Portalı/Java/Java 12 Yenilikleri (2019)
Java01-java/58-java12-yenilikleri

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ı n boş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ılabilir
Ornek1.java
1// 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}
Çıktı yerel JDK 21 ile yakalandı — tarayıcıda JVM çalışmaz.

Ornek2

çalıştırılabilir
Ornek2.java
1// 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}
Çıktı yerel JDK 21 ile yakalandı — tarayıcıda JVM çalışmaz.