Eğitim Portalı/Java/Java 8 Yenilikleri (2014, LTS)
Java01-java/54-java8-yenilikleri

Java 8 Yenilikleri (2014, LTS)

Java 8, dilin tarihindeki en dönüştürücü sürümdür. Fonksiyonel programlama öğelerini Java'ya getirerek nasıl kod yazdığımızı kökten değiştirdi. Bugün yazdığın modern Java'nın temeli bu sürümle atıldı; bu yüzden her bi…

Java 8 Yenilikleri (2014, LTS)

Java 8, dilin tarihindeki en dönüştürücü sürümdür. Fonksiyonel programlama öğelerini Java'ya getirerek nasıl kod yazdığımızı kökten değiştirdi. Bugün yazdığın modern Java'nın temeli bu sürümle atıldı; bu yüzden her birini iyi anlamak gerekir. (Sürüm evrimini topic 20'de üst düzey gördük; burada Java 8'in getirdiklerini ayrı ayrı, çalışan örneklerle derinleştiriyoruz.)

1) Lambda ifadeleri

Davranışı (bir fonksiyonu) bir değer gibi taşımayı sağlar. Önceden anonim sınıf gerektiren şeyler tek satıra iner:

Predicate<Integer> ciftMi = n -> n % 2 == 0;
Runnable r = () -> System.out.println("çalış");

2) Functional interface'ler

Lambda, tek soyut metotlu bir arayüzün (functional interface) yerine geçer. java.util.function paketi hazır olanları sunar:

ArayüzİmzaAnlamı
Predicate<T>T -> booleankoşul/filtre
Function<T,R>T -> Rdönüşüm
Consumer<T>T -> voidtüketim (yan etki)
Supplier<T>() -> Türetim
BiFunction<T,U,R>(T,U) -> Riki girdili dönüşüm

3) Metot referansları (::)

Var olan bir metodu/yapıcıyı doğrudan lambda yerine kullanma: String::length, System.out::println, ArrayList::new. Örnek 1 (./Ornek1.java) functional interface'leri, lambda'yı ve metot referanslarını gösterir.

4) Stream API

Koleksiyonları bildirimsel işleme: döngü yazmak yerine filter/map/sorted/collect gibi işlemleri zincirlersin:

isimler.stream().filter(s -> s.length() <= 4).map(String::toUpperCase)
       .sorted().collect(Collectors.joining(", "));

5) Optional

null'a tip düzeyinde güvenli alternatif: "değer var ya da yok" kutusu. orElse, map, ifPresent, findFirst ile null kontrollerini güvenli hale getirir.

6) java.time (yeni tarih/saat API'si)

Eski, hatalı ve değişebilen Date/Calendar'ın halefi: LocalDate, LocalDateTime, Period, Duration — hepsi değişmez ve thread-safe.

7) Interface default ve static metotlar

Arayüzlere gövdeli metot eklenebilir: default (varsayılan uygulama) ve static. Bu, mevcut arayüzleri — onları uygulayan tüm sınıfları bozmadan — genişletmeyi mümkün kıldı (Stream API'nin Collection'a eklenmesi bu sayede oldu).

Örnek 2 (./Ornek2.java) Stream, Optional, java.time ve interface default/static metotlarını bir arada gösterir.

Neden bu kadar önemli?

Java 8 öncesi: anonim sınıf gürültüsü, elle döngüler, null tehlikesi, kırılgan tarih API'si. Java 8 sonrası: lambda'larla temiz davranış aktarımı, stream'lerle bildirimsel işleme, Optional ile güvenli null, java.time ile sağlam tarih. Bu portaldaki Stream (topic 12), Optional (topic 13) ve Lambda (topic 11) konuları bu temelin üzerine kuruludur.

Özet

Java 8'in dört köşe taşını öğrendik: lambda + functional interface + metot referansı (Örnek 1) ve Stream + Optional + java.time + interface default/static (Örnek 2). Bu sürüm, modern Java'nın başlangıç noktasıdır. Sırada, modülerlik ve araçlarla gelen Java 9 yenilikleri.

Kod Örnekleri(2)

Ornek1

çalıştırılabilir
Ornek1.java
1// Ornek1: Java 8 — functional interface'ler, lambda ve metot referansları.
2// Çalıştırma: java Ornek1.java
3import java.util.function.BiFunction;
4import java.util.function.Consumer;
5import java.util.function.Function;
6import java.util.function.Predicate;
7import java.util.function.Supplier;
8import java.util.List;
9
10public class Ornek1 {
11
12    public static void main(String[] args) {
13        // Java 8'in dört temel functional interface'i + lambda:
14        Predicate<Integer> ciftMi = n -> n % 2 == 0;          // T -> boolean
15        Function<String, Integer> uzunluk = s -> s.length();  // T -> R
16        Consumer<String> yaz = s -> System.out.println("  tüket: " + s); // T -> void
17        Supplier<Double> rastgele = () -> 42.0;               // () -> T
18        BiFunction<Integer, Integer, Integer> topla = (a, b) -> a + b; // (T,U) -> R
19
20        System.out.println("ciftMi(4): " + ciftMi.test(4));
21        System.out.println("uzunluk(\"merhaba\"): " + uzunluk.apply("merhaba"));
22        yaz.accept("değer");
23        System.out.println("supplier: " + rastgele.get());
24        System.out.println("topla(3,5): " + topla.apply(3, 5));
25
26        // Metot referansları (:: ) — lambda'nın daha kısa hali:
27        Function<String, Integer> uzunlukRef = String::length;       // örnek metodu
28        Consumer<String> yazRef = System.out::println;               // belirli nesnenin metodu
29        Supplier<List<String>> liste = java.util.ArrayList::new;     // yapıcı (constructor) referansı
30
31        System.out.println("\nmetot ref uzunluk: " + uzunlukRef.apply("abcd"));
32        yazRef.accept("  metot ref ile yazıldı");
33        System.out.println("constructor ref boyut: " + liste.get().size());
34
35        System.out.println("""
36
37                --- Java 8: lambda + functional interface + metot referansı ---
38                Java'yı en çok değiştiren sürüm. Davranışı (fonksiyonu) bir DEĞER gibi taşımayı getirdi.
39                Functional interface: tek soyut metotlu arayüz (Predicate, Function, Consumer, Supplier...).
40                Lambda: bunları kısa yazmanın yolu (n -> n%2==0).
41                Metot referansı (::): var olan bir metodu/yapıcıyı lambda yerine kullanma (String::length).""");
42    }
43}
Çıktı yerel JDK 21 ile yakalandı — tarayıcıda JVM çalışmaz.

Ornek2

çalıştırılabilir
Ornek2.java
1// Ornek2: Java 8 — Stream API, Optional, java.time ve interface default/static metotları.
2// Çalıştırma: java Ornek2.java
3import java.time.LocalDate;
4import java.time.Period;
5import java.util.List;
6import java.util.Optional;
7import java.util.stream.Collectors;
8
9public class Ornek2 {
10
11    // Java 8: interface'lerde DEFAULT ve STATIC metotlar (gövdeli) tanımlanabilir.
12    interface Selamlama {
13        String ad();
14        default String selamla() { return "Merhaba, " + ad() + "!"; } // default metot
15        static Selamlama of(String ad) { return () -> ad; }            // static fabrika
16    }
17
18    public static void main(String[] args) {
19        // Stream API: bildirimsel veri işleme
20        List<String> isimler = List.of("ada", "burak", "can", "derya", "berk");
21        String sonuc = isimler.stream()
22                .filter(s -> s.length() <= 4)
23                .map(String::toUpperCase)
24                .sorted()
25                .collect(Collectors.joining(", "));
26        System.out.println("Stream sonucu: " + sonuc);
27
28        long sayim = isimler.stream().filter(s -> s.startsWith("b")).count();
29        System.out.println("'b' ile başlayan: " + sayim);
30
31        // Optional: null yerine güvenli "olabilir/olmayabilir" kutusu
32        Optional<String> ilkUzun = isimler.stream().filter(s -> s.length() > 4).findFirst();
33        System.out.println("İlk uzun isim: " + ilkUzun.orElse("yok"));
34
35        // java.time: değişmez, güvenli tarih/saat
36        LocalDate dogum = LocalDate.of(1995, 5, 20);
37        Period yas = Period.between(dogum, LocalDate.of(2026, 1, 1));
38        System.out.println("Yaş: " + yas.getYears() + " yıl");
39
40        // default/static interface metotları
41        Selamlama s = Selamlama.of("Ada");
42        System.out.println(s.selamla());
43
44        System.out.println("""
45
46                --- Java 8: Stream, Optional, java.time, interface default/static ---
47                Stream: filter/map/sorted/collect ile bildirimsel veri işleme (döngü yerine).
48                Optional: null'a tip düzeyinde güvenli alternatif (orElse/map/ifPresent).
49                java.time: değişmez ve güvenli tarih/saat (Date/Calendar'ın halefi).
50                Interface default/static metotlar: API'leri bozmadan genişletme imkânı.""");
51    }
52}
Çıktı yerel JDK 21 ile yakalandı — tarayıcıda JVM çalışmaz.