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 | İmza | Anlamı |
|---|---|---|
Predicate<T> | T -> boolean | koşul/filtre |
Function<T,R> | T -> R | dönüşüm |
Consumer<T> | T -> void | tüketim (yan etki) |
Supplier<T> | () -> T | üretim |
BiFunction<T,U,R> | (T,U) -> R | iki 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ılabilir1// 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}Ornek2
çalıştırılabilir1// 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}