{"id":33934,"date":"2025-11-09T01:40:42","date_gmt":"2025-11-08T22:40:42","guid":{"rendered":"https:\/\/fatihsoysal.com\/blog\/?p=33934"},"modified":"2025-11-09T01:40:42","modified_gmt":"2025-11-08T22:40:42","slug":"java-8-ozellikleri-ve-orneklerle-detayli-anlatim","status":"publish","type":"post","link":"https:\/\/fatihsoysal.com\/blog\/java-8-ozellikleri-ve-orneklerle-detayli-anlatim\/","title":{"rendered":"Java 8 \u00d6zellikleri ve \u00d6rneklerle Detayl\u0131 Anlat\u0131m"},"content":{"rendered":"<p><body><\/p>\n<h2>Java 8 \u00d6zellikleri ve \u00d6rneklerle Detayl\u0131 Anlat\u0131m<\/h2>\n<p>Java platformu, 2014 y\u0131l\u0131nda yay\u0131nlanan Java 8 ile \u00f6nemli bir d\u00f6n\u00fcm noktas\u0131na ula\u015ft\u0131. Bu s\u00fcr\u00fcm, dilin evriminde b\u00fcy\u00fck bir s\u0131\u00e7ramay\u0131 temsil ederek, \u00f6zellikle fonksiyonel programlama paradigmalar\u0131n\u0131 Java d\u00fcnyas\u0131na entegre etti. Geli\u015ftiricilerin kod yazma \u015feklini k\u00f6kten de\u011fi\u015ftiren Java 8, daha temiz, daha \u00f6zl\u00fc ve daha verimli kodlar yazma imkan\u0131 sundu. Bu makalede, Java 8&#8217;in getirdi\u011fi temel \u00f6zellikleri, detayl\u0131 a\u00e7\u0131klamalar ve pratik \u00f6rneklerle ele alaca\u011f\u0131z.<\/p>\n<h3>1. Lambda \u0130fadeleri (Lambda Expressions)<\/h3>\n<p>Java 8&#8217;in en \u00e7\u0131\u011f\u0131r a\u00e7\u0131c\u0131 \u00f6zelliklerinden biri olan Lambda \u0130fadeleri, fonksiyonel programlaman\u0131n temel ta\u015flar\u0131ndan biridir. Tek bir soyut metodu olan aray\u00fczlerin (yani fonksiyonel aray\u00fczlerin) anonim olarak implementasyonunu sa\u011flarlar. Bu sayede, daha az kodla daha i\u015flevsel yap\u0131lar olu\u015fturmak m\u00fcmk\u00fcn hale gelir.<\/p>\n<h4>Lambda \u0130fadelerinin Yap\u0131s\u0131 ve Avantajlar\u0131<\/h4>\n<p>Bir lambda ifadesi temelde \u00fc\u00e7 b\u00f6l\u00fcmden olu\u015fur:<br \/>\n1.  <strong>Parametre Listesi:<\/strong> Metodun arg\u00fcmanlar\u0131. Parantez i\u00e7inde belirtilirler (\u00f6rne\u011fin, <code>(a, b)<\/code> veya <code>(String s)<\/code>). Parametre yoksa bo\u015f parantez <code>()<\/code> kullan\u0131l\u0131r. Tek bir parametre varsa ve tipi a\u00e7\u0131k\u00e7a belirtilmiyorsa parantez kullan\u0131lmayabilir (\u00f6rne\u011fin, <code>s -><\/code>).<br \/>\n2.  <strong>Ok \u0130\u015fareti:<\/strong> Parametre listesi ile g\u00f6vdeyi ay\u0131ran <code>-><\/code> sembol\u00fc.<br \/>\n3.  <strong>G\u00f6vde:<\/strong> Lambda ifadesinin \u00e7al\u0131\u015ft\u0131raca\u011f\u0131 kod blo\u011fu. Tek bir ifade ise s\u00fcsl\u00fc parantez <code>{}<\/code> iste\u011fe ba\u011fl\u0131d\u0131r. Birden fazla ifade ise s\u00fcsl\u00fc parantezler zorunludur.<\/p>\n<p><strong>Avantajlar\u0131:<\/strong><br \/>\n*   <strong>Daha Az Kod:<\/strong> Anonim i\u00e7 s\u0131n\u0131flara g\u00f6re \u00e7ok daha az kod yazmay\u0131 sa\u011flar.<br \/>\n*   <strong>Okunabilirlik:<\/strong> Kodun amac\u0131n\u0131 daha net bir \u015fekilde ifade eder.<br \/>\n*   <strong>Fonksiyonel Programlama:<\/strong> Java&#8217;da fonksiyonel programlama stilini benimsemeyi kolayla\u015ft\u0131r\u0131r.<\/p>\n<p><strong>\u00d6rnek:<\/strong> <code>Runnable<\/code> aray\u00fcz\u00fcn\u00fc lambda ile kullanma<\/p>\n<pre><code class=\"language-java\">import java.util.Comparator;\n\npublic class LambdaOrnek {\n    public static void main(String[] args) {\n        \/\/ Geleneksel y\u00f6ntemle Runnable kullan\u0131m\u0131 (anonim i\u00e7 s\u0131n\u0131f)\n        Runnable eskiRunnable = new Runnable() {\n            @Override\n            public void run() {\n                System.out.println(\"Eski y\u00f6ntemle \u00e7al\u0131\u015fan Runnable.\");\n            }\n        };\n        new Thread(eskiRunnable).start();\n\n        \/\/ Lambda ifadesiyle Runnable kullan\u0131m\u0131\n        Runnable yeniRunnable = () -> System.out.println(\"Lambda ile \u00e7al\u0131\u015fan Runnable.\");\n        new Thread(yeniRunnable).start();\n\n        \/\/ Comparator aray\u00fcz\u00fcn\u00fc lambda ile kullanma\n        Comparator<Integer> integerKarsilastirici = (a, b) -> a.compareTo(b);\n        System.out.println(\"10 ve 5 kar\u015f\u0131la\u015ft\u0131rmas\u0131: \" + integerKarsilastirici.compare(10, 5)); \/\/ Pozitif de\u011fer d\u00f6ner\n        System.out.println(\"5 ve 10 kar\u015f\u0131la\u015ft\u0131rmas\u0131: \" + integerKarsilastirici.compare(5, 10)); \/\/ Negatif de\u011fer d\u00f6ner\n    }\n}<\/code><\/pre>\n<p>Bu \u00f6rnekte, <code>Runnable<\/code> ve <code>Comparator<\/code> gibi fonksiyonel aray\u00fczlerin lambda ifadeleriyle ne kadar daha sade bir \u015fekilde yaz\u0131labilece\u011fi g\u00f6sterilmi\u015ftir.<\/p>\n<h3>2. Fonksiyonel Aray\u00fczler (Functional Interfaces)<\/h3>\n<p>Lambda ifadelerinin temelini olu\u015fturan yap\u0131lar fonksiyonel aray\u00fczlerdir. Bir aray\u00fcz\u00fcn fonksiyonel aray\u00fcz olabilmesi i\u00e7in yaln\u0131zca bir tane soyut metodu (Single Abstract Method &#8211; SAM) olmas\u0131 gerekir. Java 8 ile birlikte <code>java.util.function<\/code> paketi alt\u0131nda bir\u00e7ok haz\u0131r fonksiyonel aray\u00fcz sunulmu\u015ftur. Bu aray\u00fczler, yayg\u0131n fonksiyonel programlama kal\u0131plar\u0131n\u0131 desteklemek i\u00e7in tasarlanm\u0131\u015ft\u0131r.<\/p>\n<h4>Haz\u0131r Fonksiyonel Aray\u00fczler<\/h4>\n<p>*   <strong><code>Predicate<T><\/code>:<\/strong> Bir <code>T<\/code> tipindeki nesneyi al\u0131r ve <code>boolean<\/code> bir de\u011fer d\u00f6nd\u00fcr\u00fcr. Ko\u015fullar\u0131 kontrol etmek i\u00e7in kullan\u0131l\u0131r.<br \/>\n    *   <code>boolean test(T t);<\/code><br \/>\n*   <strong><code>Consumer<T><\/code>:<\/strong> Bir <code>T<\/code> tipindeki nesneyi al\u0131r ve bir i\u015flem yapar, herhangi bir de\u011fer d\u00f6nd\u00fcrmez.<br \/>\n    *   <code>void accept(T t);<\/code><br \/>\n*   <strong><code>Function<T, R><\/code>:<\/strong> Bir <code>T<\/code> tipindeki nesneyi al\u0131r ve onu <code>R<\/code> tipindeki bir nesneye d\u00f6n\u00fc\u015ft\u00fcr\u00fcr.<br \/>\n    *   <code>R apply(T t);<\/code><br \/>\n*   <strong><code>Supplier<T><\/code>:<\/strong> Hi\u00e7bir arg\u00fcman almaz ve <code>T<\/code> tipinde bir de\u011fer d\u00f6nd\u00fcr\u00fcr. Nesne \u00fcretmek i\u00e7in kullan\u0131l\u0131r.<br \/>\n    *   <code>T get();<\/code><br \/>\n*   <strong><code>UnaryOperator<T><\/code>:<\/strong> <code>Function<T, T><\/code>&#8216;nin \u00f6zel bir durumudur; ayn\u0131 tipte bir arg\u00fcman al\u0131r ve ayn\u0131 tipte bir de\u011fer d\u00f6nd\u00fcr\u00fcr.<br \/>\n    *   <code>T apply(T t);<\/code><br \/>\n*   <strong><code>BinaryOperator<T><\/code>:<\/strong> <code>BiFunction<T, T, T><\/code>&#8216;nin \u00f6zel bir durumudur; ayn\u0131 tipte iki arg\u00fcman al\u0131r ve ayn\u0131 tipte bir de\u011fer d\u00f6nd\u00fcr\u00fcr.<br \/>\n    *   <code>T apply(T t1, T t2);<\/code><\/p>\n<p><strong>\u00d6rnek:<\/strong> \u00c7e\u015fitli fonksiyonel aray\u00fczlerin kullan\u0131m\u0131<\/p>\n<pre><code class=\"language-java\">import java.util.function.Consumer;\nimport java.util.function.Function;\nimport java.util.function.Predicate;\nimport java.util.function.Supplier;\n\npublic class FunctionalInterfaceOrnek {\n    public static void main(String[] args) {\n        \/\/ Predicate \u00f6rne\u011fi: Bir say\u0131n\u0131n \u00e7ift olup olmad\u0131\u011f\u0131n\u0131 kontrol etme\n        Predicate<Integer> ciftSayiMi = sayi -> sayi % 2 == 0;\n        System.out.println(\"10 \u00e7ift say\u0131 m\u0131? \" + ciftSayiMi.test(10)); \/\/ true\n        System.out.println(\"7 \u00e7ift say\u0131 m\u0131? \" + ciftSayiMi.test(7));   \/\/ false\n\n        \/\/ Consumer \u00f6rne\u011fi: Bir mesaj\u0131 ekrana yazd\u0131rma\n        Consumer<String> mesajYazdir = mesaj -> System.out.println(\"Mesaj: \" + mesaj);\n        mesajYazdir.accept(\"Merhaba Java 8!\");\n\n        \/\/ Function \u00f6rne\u011fi: Bir String'i b\u00fcy\u00fck harfe d\u00f6n\u00fc\u015ft\u00fcrme\n        Function<String, String> buyukHarfeCevir = metin -> metin.toUpperCase();\n        System.out.println(\"B\u00fcy\u00fck harf: \" + buyukHarfeCevir.apply(\"java 8\")); \/\/ JAVA 8\n\n        \/\/ Supplier \u00f6rne\u011fi: Rastgele bir say\u0131 \u00fcretme\n        Supplier<Double> rastgeleSayiUret = () -> Math.random();\n        System.out.println(\"Rastgele say\u0131: \" + rastgeleSayiUret.get());\n    }\n}<\/code><\/pre>\n<h3>3. Stream API<\/h3>\n<p>Java 8 Stream API, koleksiyonlar \u00fczerinde fonksiyonel stil operasyonlar\u0131 ger\u00e7ekle\u015ftirmek i\u00e7in g\u00fc\u00e7l\u00fc ve esnek bir yol sunar. Koleksiyonlardaki verileri i\u015flemek i\u00e7in deklaratif (ne yap\u0131laca\u011f\u0131n\u0131 belirten) bir yakla\u015f\u0131m sa\u011flar, imperatif (nas\u0131l yap\u0131laca\u011f\u0131n\u0131 belirten) yakla\u015f\u0131ma k\u0131yasla daha okunabilir ve paralel i\u015flemeye daha uygun kodlar yazmaya olanak tan\u0131r.<\/p>\n<h4>Stream API&#8217;nin Temel Bile\u015fenleri<\/h4>\n<p>Bir Stream pipeline&#8217;\u0131 genellikle \u015fu ad\u0131mlardan olu\u015fur:<br \/>\n1.  <strong>Kaynak (Source):<\/strong> Bir koleksiyon, dizi, I\/O kanal\u0131 veya bir \u00fcretici fonksiyonu olabilir.<br \/>\n2.  <strong>Ara \u0130\u015flemler (Intermediate Operations):<\/strong> Bir stream&#8217;i ba\u015fka bir stream&#8217;e d\u00f6n\u00fc\u015ft\u00fcren i\u015flemlerdir. Zincirlenebilirler (lazy evaluation) ve terminal bir i\u015flem \u00e7a\u011fr\u0131lana kadar \u00e7al\u0131\u015fmazlar. \u00d6rnekler: <code>filter()<\/code>, <code>map()<\/code>, <code>distinct()<\/code>, <code>sorted()<\/code>, <code>peek()<\/code>, <code>limit()<\/code>, <code>skip()<\/code>.<br \/>\n3.  <strong>Terminal \u0130\u015flem (Terminal Operation):<\/strong> Stream&#8217;i sonland\u0131ran ve bir sonu\u00e7 \u00fcreten i\u015flemlerdir. Stream&#8217;i t\u00fcketirler ve bir daha kullan\u0131lamaz hale getirirler. \u00d6rnekler: <code>forEach()<\/code>, <code>collect()<\/code>, <code>reduce()<\/code>, <code>count()<\/code>, <code>min()<\/code>, <code>max()<\/code>, <code>anyMatch()<\/code>, <code>allMatch()<\/code>, <code>noneMatch()<\/code>, <code>findFirst()<\/code>, <code>findAny()<\/code>.<\/p>\n<p><strong>\u00d6rnek:<\/strong> Stream API ile veri i\u015fleme<\/p>\n<pre><code class=\"language-java\">import java.util.Arrays;\nimport java.util.List;\nimport java.util.stream.Collectors;\n\npublic class StreamApiOrnek {\n    public static void main(String[] args) {\n        List<String> kelimeler = Arrays.asList(\"elma\", \"armut\", \"kiraz\", \"\u00fcz\u00fcm\", \"nar\", \"karpuz\");\n\n        \/\/ 1. 'a' harfi i\u00e7eren kelimeleri filtrele\n        \/\/ 2. Bu kelimeleri b\u00fcy\u00fck harfe d\u00f6n\u00fc\u015ft\u00fcr\n        \/\/ 3. S\u0131rala\n        \/\/ 4. Yeni bir List olarak topla\n        List<String> islenmisKelimeler = kelimeler.stream()\n                .filter(kelime -> kelime.contains(\"a\")) \/\/ Ara i\u015flem: 'a' i\u00e7erenleri filtrele\n                .map(String::toUpperCase)              \/\/ Ara i\u015flem: B\u00fcy\u00fck harfe \u00e7evir (Metot Referans\u0131)\n                .sorted()                              \/\/ Ara i\u015flem: Alfabetik s\u0131rala\n                .collect(Collectors.toList());         \/\/ Terminal i\u015flem: Sonu\u00e7lar\u0131 listeye topla\n\n        System.out.println(\"\u0130\u015flenmi\u015f kelimeler: \" + islenmisKelimeler);\n        \/\/ \u00c7\u0131kt\u0131: [ARMUT, ELMA, KARPUZ, NAR]\n\n        \/\/ Say\u0131 listesi \u00fczerinde \u00e7e\u015fitli i\u015flemler\n        List<Integer> sayilar = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9, 10);\n\n        \/\/ \u00c7ift say\u0131lar\u0131n karelerinin toplam\u0131n\u0131 bulma\n        int toplamKare = sayilar.stream()\n                .filter(s -> s % 2 == 0) \/\/ Sadece \u00e7ift say\u0131lar\u0131 filtrele\n                .map(s -> s * s)         \/\/ Karelerini al\n                .reduce(0, Integer::sum); \/\/ Ba\u015flang\u0131\u00e7 de\u011feri 0, toplama i\u015flemi (Metot Referans\u0131)\n\n        System.out.println(\"\u00c7ift say\u0131lar\u0131n karelerinin toplam\u0131: \" + toplamKare); \/\/ \u00c7\u0131kt\u0131: 220 (4+16+36+64+100)\n\n        \/\/ \u0130lk 3 tek say\u0131y\u0131 bul ve ekrana yazd\u0131r\n        sayilar.stream()\n                .filter(s -> s % 2 != 0) \/\/ Tek say\u0131lar\u0131 filtrele\n                .limit(3)                \/\/ \u0130lk 3 tanesini al\n                .forEach(System.out::println); \/\/ Her birini ekrana yazd\u0131r (Metot Referans\u0131)\n        \/\/ \u00c7\u0131kt\u0131:\n        \/\/ 1\n        \/\/ 3\n        \/\/ 5\n\n        \/\/ Paralel Stream kullan\u0131m\u0131 (b\u00fcy\u00fck veri setleri i\u00e7in faydal\u0131d\u0131r)\n        long baslangic = System.nanoTime();\n        long sayiAdedi = sayilar.parallelStream()\n                                .filter(s -> s > 5)\n                                .count();\n        long bitis = System.nanoTime();\n        System.out.println(\"5'ten b\u00fcy\u00fck say\u0131 adedi: \" + sayiAdedi + \", S\u00fcre: \" + (bitis - baslangic) + \" ns\");\n    }\n}<\/code><\/pre>\n<p>Stream API, b\u00fcy\u00fck veri setlerini i\u015flerken ve paralel i\u015flemleri kolayca uygulamak istedi\u011finizde olduk\u00e7a g\u00fc\u00e7l\u00fc bir ara\u00e7t\u0131r.<\/p>\n<h3>4. Aray\u00fczlerde Varsay\u0131lan Metotlar (Default Methods in Interfaces)<\/h3>\n<p>Java 8 \u00f6ncesinde, bir aray\u00fcze yeni bir metot eklemek, bu aray\u00fcz\u00fc implemente eden t\u00fcm s\u0131n\u0131flar\u0131n bozulmas\u0131na neden olurdu, \u00e7\u00fcnk\u00fc bu s\u0131n\u0131flar\u0131n yeni metodu implemente etmesi gerekirdi. Varsay\u0131lan metotlar, bu sorunu \u00e7\u00f6zmek i\u00e7in tan\u0131t\u0131ld\u0131. <code>default<\/code> anahtar kelimesi kullan\u0131larak, aray\u00fczlere metot g\u00f6vdeleri eklenebilir. Bu sayede, aray\u00fcz geni\u015fletilirken mevcut implementasyonlar bozulmaz.<\/p>\n<p>Ayr\u0131ca, aray\u00fczlere <code>static<\/code> metotlar da eklenebilir. Bu metotlar, aray\u00fcz\u00fcn bir implementasyonuna ihtiya\u00e7 duymadan do\u011frudan aray\u00fcz ad\u0131 \u00fczerinden \u00e7a\u011fr\u0131labilir.<\/p>\n<p><strong>\u00d6rnek:<\/strong> Varsay\u0131lan metot ve statik metot kullan\u0131m\u0131<\/p>\n<pre><code class=\"language-java\">interface Calisan {\n    void calis(); \/\/ Soyut metot\n\n    \/\/ Varsay\u0131lan metot\n    default void molaVer() {\n        System.out.println(\"\u00c7al\u0131\u015fan mola veriyor (varsay\u0131lan).\");\n    }\n\n    \/\/ Statik metot\n    static void sirketBilgisi() {\n        System.out.println(\"Bu \u015firket 1990 y\u0131l\u0131nda kuruldu.\");\n    }\n}\n\nclass Yazilimci implements Calisan {\n    @Override\n    public void calis() {\n        System.out.println(\"Yaz\u0131l\u0131mc\u0131 kod yaz\u0131yor.\");\n    }\n\n    \/\/ Varsay\u0131lan metodu override edebilir\n    @Override\n    public void molaVer() {\n        System.out.println(\"Yaz\u0131l\u0131mc\u0131 kahve molas\u0131 veriyor.\");\n    }\n}\n\nclass Muhasebeci implements Calisan {\n    @Override\n    public void calis() {\n        System.out.println(\"Muhasebeci defter tutuyor.\");\n    }\n    \/\/ Muhasebeci molaVer metodunu override etmiyor, varsay\u0131lan\u0131 kullanacak\n}\n\npublic class DefaultMethodOrnek {\n    public static void main(String[] args) {\n        Yazilimci yazilimci = new Yazilimci();\n        yazilimci.calis();\n        yazilimci.molaVer(); \/\/ Yaz\u0131l\u0131mc\u0131 kendi override etti\u011fi metodu \u00e7a\u011f\u0131r\u0131r\n\n        Muhasebeci muhasebeci = new Muhasebeci();\n        muhasebeci.calis();\n        muhasebeci.molaVer(); \/\/ Muhasebeci varsay\u0131lan metodu \u00e7a\u011f\u0131r\u0131r\n\n        Calisan.sirketBilgisi(); \/\/ Statik metot do\u011frudan aray\u00fcz \u00fczerinden \u00e7a\u011fr\u0131l\u0131r\n    }\n}<\/code><\/pre>\n<h3>5. Optional S\u0131n\u0131f\u0131<\/h3>\n<p><code>java.util.Optional<T><\/code> s\u0131n\u0131f\u0131, bir de\u011ferin varl\u0131\u011f\u0131n\u0131 veya yoklu\u011funu temsil etmek i\u00e7in kullan\u0131l\u0131r. Temel amac\u0131, <code>NullPointerException<\/code> (NPE) hatalar\u0131n\u0131 \u00f6nlemektir. Geleneksel olarak, bir metot <code>null<\/code> d\u00f6nd\u00fcrd\u00fc\u011f\u00fcnde, \u00e7a\u011f\u0131ran\u0131n bu <code>null<\/code> durumu kontrol etmesi ve uygun \u015fekilde ele almas\u0131 gerekirdi. <code>Optional<\/code> ile, bir de\u011ferin mevcut olup olmad\u0131\u011f\u0131n\u0131 a\u00e7\u0131k\u00e7a belirtirsiniz ve bu durumu daha g\u00fcvenli bir \u015fekilde y\u00f6netmenizi sa\u011flars\u0131n\u0131z.<\/p>\n<h4>Optional Kullan\u0131m\u0131n\u0131n Avantajlar\u0131<\/h4>\n<p>*   <strong>NPE Korumas\u0131:<\/strong> <code>null<\/code> kontrolleri yerine <code>Optional<\/code> metotlar\u0131n\u0131 kullanarak daha g\u00fcvenli kod yaz\u0131l\u0131r.<br \/>\n*   <strong>Kod Okunabilirli\u011fi:<\/strong> Bir metodun <code>Optional<\/code> d\u00f6nd\u00fcrmesi, o metodun bir de\u011fer d\u00f6nd\u00fcrmeyebilece\u011fini a\u00e7\u0131k\u00e7a belirtir.<br \/>\n*   <strong>Deklaratif Yakla\u015f\u0131m:<\/strong> <code>ifPresent()<\/code>, <code>orElse()<\/code>, <code>map()<\/code>, <code>flatMap()<\/code> gibi metotlar sayesinde daha fonksiyonel ve deklaratif kod yaz\u0131l\u0131r.<\/p>\n<p><strong>\u00d6rnek:<\/strong> <code>Optional<\/code> s\u0131n\u0131f\u0131n\u0131n kullan\u0131m\u0131<\/p>\n<pre><code class=\"language-java\">import java.util.Optional;\n\npublic class OptionalOrnek {\n    public static Optional<String> kullaniciAdiGetir(int id) {\n        if (id == 1) {\n            return Optional.of(\"ali\"); \/\/ De\u011fer mevcut\n        } else if (id == 2) {\n            return Optional.of(\"veli\");\n        } else {\n            return Optional.empty(); \/\/ De\u011fer mevcut de\u011fil\n        }\n    }\n\n    public static void main(String[] args) {\n        \/\/ ID 1 i\u00e7in kullan\u0131c\u0131 ad\u0131n\u0131 getir\n        Optional<String> kullanici1 = kullaniciAdiGetir(1);\n        kullanici1.ifPresent(ad -> System.out.println(\"Kullan\u0131c\u0131 1 Ad\u0131: \" + ad)); \/\/ E\u011fer de\u011fer varsa yazd\u0131r\n\n        \/\/ ID 3 i\u00e7in kullan\u0131c\u0131 ad\u0131n\u0131 getir (mevcut de\u011fil)\n        Optional<String> kullanici3 = kullaniciAdiGetir(3);\n        System.out.println(\"Kullan\u0131c\u0131 3 Ad\u0131: \" + kullanici3.orElse(\"Misafir\")); \/\/ E\u011fer de\u011fer yoksa \"Misafir\" kullan\n\n        \/\/ E\u011fer de\u011fer yoksa hata f\u0131rlat\n        try {\n            Optional<String> kullanici4 = kullaniciAdiGetir(4);\n            String ad4 = kullanici4.orElseThrow(() -> new IllegalArgumentException(\"Kullan\u0131c\u0131 bulunamad\u0131!\"));\n            System.out.println(\"Kullan\u0131c\u0131 4 Ad\u0131: \" + ad4);\n        } catch (IllegalArgumentException e) {\n            System.out.println(e.getMessage());\n        }\n\n        \/\/ Map metodu ile Optional i\u00e7indeki de\u011feri d\u00f6n\u00fc\u015ft\u00fcrme\n        Optional<String> kullanici2 = kullaniciAdiGetir(2);\n        String buyukHarfAd = kullanici2.map(String::toUpperCase)\n                                       .orElse(\"BILINMIYOR\");\n        System.out.println(\"Kullan\u0131c\u0131 2 Ad\u0131 (B\u00fcy\u00fck Harf): \" + buyukHarfAd);\n    }\n}<\/code><\/pre>\n<h3>6. Yeni Date ve Time API (java.time paketi)<\/h3>\n<p>Java 8&#8217;den \u00f6nce <code>java.util.Date<\/code> ve <code>java.util.Calendar<\/code> s\u0131n\u0131flar\u0131, tarih ve saat i\u015flemleri i\u00e7in kullan\u0131l\u0131yordu. Ancak bu s\u0131n\u0131flar\u0131n bir\u00e7ok problemi vard\u0131: de\u011fi\u015ftirilebilir olmalar\u0131, thread-safe olmamalar\u0131, API&#8217;lerinin karma\u015f\u0131k ve tutars\u0131z olmas\u0131 gibi. Java 8, bu sorunlar\u0131 \u00e7\u00f6zmek i\u00e7in Joda-Time k\u00fct\u00fcphanesinden esinlenerek tamamen yeni bir Date ve Time API&#8217;si (JSR 310) tan\u0131tt\u0131. <code>java.time<\/code> paketi alt\u0131nda yer alan bu yeni API, daha temiz, daha g\u00fcvenli ve daha sezgisel bir kullan\u0131m sunar.<\/p>\n<h4>Temel S\u0131n\u0131flar<\/h4>\n<p>*   <strong><code>LocalDate<\/code>:<\/strong> Y\u0131l, ay, g\u00fcn gibi tarih bilgisini tutar, saat bilgisi i\u00e7ermez.<br \/>\n*   <strong><code>LocalTime<\/code>:<\/strong> Saat, dakika, saniye, nanosaniye gibi saat bilgisini tutar, tarih bilgisi i\u00e7ermez.<br \/>\n*   <strong><code>LocalDateTime<\/code>:<\/strong> Hem tarih hem de saat bilgisini tutar, zaman dilimi bilgisi i\u00e7ermez.<br \/>\n*   <strong><code>ZonedDateTime<\/code>:<\/strong> <code>LocalDateTime<\/code>&#8216;a ek olarak zaman dilimi bilgisini de tutar.<br \/>\n*   <strong><code>Instant<\/code>:<\/strong> Unix epoch&#8217;tan (1 Ocak 1970 UTC) bu yana ge\u00e7en zaman\u0131 nanosaniye hassasiyetinde temsil eder. Makine zaman\u0131 i\u00e7in idealdir.<br \/>\n*   <strong><code>Duration<\/code>:<\/strong> \u0130ki <code>Instant<\/code> veya <code>LocalTime<\/code> aras\u0131ndaki zaman fark\u0131n\u0131 saniye ve nanosaniye olarak \u00f6l\u00e7er.<br \/>\n*   <strong><code>Period<\/code>:<\/strong> \u0130ki <code>LocalDate<\/code> aras\u0131ndaki zaman fark\u0131n\u0131 y\u0131l, ay ve g\u00fcn olarak \u00f6l\u00e7er.<\/p>\n<p>T\u00fcm bu s\u0131n\u0131flar immutabled\u0131r (de\u011fi\u015ftirilemez), bu da onlar\u0131 thread-safe yapar.<\/p>\n<p><strong>\u00d6rnek:<\/strong> Yeni Date ve Time API kullan\u0131m\u0131<\/p>\n<pre><code class=\"language-java\">import java.time.LocalDate;\nimport java.time.LocalDateTime;\nimport java.time.LocalTime;\nimport java.time.Month;\nimport java.time.ZoneId;\nimport java.time.ZonedDateTime;\nimport java.time.format.DateTimeFormatter;\nimport java.time.temporal.ChronoUnit;\n\npublic class DateTimeApiOrnek {\n    public static void main(String[] args) {\n        \/\/ LocalDate kullan\u0131m\u0131\n        LocalDate bugun = LocalDate.now();\n        System.out.println(\"Bug\u00fcn\u00fcn tarihi: \" + bugun); \/\/ YYYY-MM-DD\n        LocalDate dogumGunu = LocalDate.of(1990, Month.MAY, 15);\n        System.out.println(\"Do\u011fum g\u00fcn\u00fc: \" + dogumGunu);\n\n        \/\/ LocalTime kullan\u0131m\u0131\n        LocalTime suAnkiSaat = LocalTime.now();\n        System.out.println(\"\u015eu anki saat: \" + suAnkiSaat); \/\/ HH:MM:SS.NNNNNNNNN\n        LocalTime belirliSaat = LocalTime.of(14, 30, 0);\n        System.out.println(\"Belirli saat: \" + belirliSaat);\n\n        \/\/ LocalDateTime kullan\u0131m\u0131\n        LocalDateTime suAnkiTarihSaat = LocalDateTime.now();\n        System.out.println(\"\u015eu anki tarih ve saat: \" + suAnkiTarihSaat);\n        LocalDateTime gelecektekiTarihSaat = suAnkiTarihSaat.plusDays(5).plusHours(3);\n        System.out.println(\"5 g\u00fcn 3 saat sonra: \" + gelecektekiTarihSaat);\n\n        \/\/ ZonedDateTime kullan\u0131m\u0131 (Zaman dilimli tarih ve saat)\n        ZonedDateTime newYorkZamani = ZonedDateTime.now(ZoneId.of(\"America\/New_York\"));\n        System.out.println(\"New York zaman\u0131: \" + newYorkZamani);\n\n        \/\/ Tarih ve saatler aras\u0131 fark hesaplama (Period ve Duration)\n        LocalDate tarih1 = LocalDate.of(2023, 1, 1);\n        LocalDate tarih2 = LocalDate.of(2024, 5, 10);\n        long gunFarki = ChronoUnit.DAYS.between(tarih1, tarih2);\n        System.out.println(\"\u0130ki tarih aras\u0131 g\u00fcn fark\u0131: \" + gunFarki);\n\n        \/\/ Tarih ve saat formatlama\n        DateTimeFormatter formatter = DateTimeFormatter.ofPattern(\"dd\/MM\/yyyy HH:mm:ss\");\n        String formatliTarihSaat = suAnkiTarihSaat.format(formatter);\n        System.out.println(\"Formatl\u0131 tarih ve saat: \" + formatliTarihSaat);\n\n        \/\/ String'den tarih\/saat parse etme\n        String tarihStr = \"25\/12\/2023 10:00:00\";\n        LocalDateTime parsedDateTime = LocalDateTime.parse(tarihStr, formatter);\n        System.out.println(\"Parse edilmi\u015f tarih ve saat: \" + parsedDateTime);\n    }\n}<\/code><\/pre>\n<h3>7. Metot Referanslar\u0131 (Method References)<\/h3>\n<p>Metot referanslar\u0131, lambda ifadelerinin daha k\u0131sa ve okunabilir bir alternatifidir. Bir lambda ifadesi sadece mevcut bir metodu \u00e7a\u011f\u0131r\u0131yorsa, bu lambda ifadesini bir metot referans\u0131 ile de\u011fi\u015ftirebiliriz. Bu, kodun daha da sadele\u015fmesini sa\u011flar ve kodun ne yapt\u0131\u011f\u0131n\u0131 daha net bir \u015fekilde ifade eder.<\/p>\n<h4>Metot Referans\u0131 T\u00fcrleri<\/h4>\n<p>1.  <strong>Statik Metot Referans\u0131:<\/strong> <code>ClassName::staticMethodName<\/code><br \/>\n    *   \u00d6rnek: <code>Math::max<\/code> (lambda kar\u015f\u0131l\u0131\u011f\u0131: <code>(a, b) -> Math.max(a, b)<\/code>)<br \/>\n2.  <strong>Belirli Bir Nesnenin \u00d6rnek Metodu Referans\u0131:<\/strong> <code>object::instanceMethodName<\/code><br \/>\n    *   \u00d6rnek: <code>System.out::println<\/code> (lambda kar\u015f\u0131l\u0131\u011f\u0131: <code>s -> System.out.println(s)<\/code>)<br \/>\n3.  <strong>Belirli Bir T\u00fcrdeki Rastgele Bir Nesnenin \u00d6rnek Metodu Referans\u0131:<\/strong> <code>ClassName::instanceMethodName<\/code><br \/>\n    *   \u00d6rnek: <code>String::length<\/code> (lambda kar\u015f\u0131l\u0131\u011f\u0131: <code>s -> s.length()<\/code>)<br \/>\n    *   \u00d6rnek: <code>String::compareToIgnoreCase<\/code> (lambda kar\u015f\u0131l\u0131\u011f\u0131: <code>(s1, s2) -> s1.compareToIgnoreCase(s2)<\/code>)<br \/>\n4.  <strong>Kurucu Metot Referans\u0131:<\/strong> <code>ClassName::new<\/code><br \/>\n    *   \u00d6rnek: <code>ArrayList::new<\/code> (lambda kar\u015f\u0131l\u0131\u011f\u0131: <code>() -> new ArrayList()<\/code>)<\/p>\n<p><strong>\u00d6rnek:<\/strong> Metot referanslar\u0131n\u0131n kullan\u0131m\u0131<\/p>\n<pre><code class=\"language-java\">import java.util.Arrays;\nimport java.util.List;\nimport java.util.function.Consumer;\nimport java.util.function.Function;\nimport java.util.stream.Collectors;\n\npublic class MethodReferenceOrnek {\n    public static void main(String[] args) {\n        List<String> isimler = Arrays.asList(\"Ay\u015fe\", \"Fatma\", \"Can\", \"Deniz\");\n\n        \/\/ 1. Belirli bir nesnenin \u00f6rnek metodu referans\u0131 (System.out::println)\n        System.out.println(\"\u0130simler (forEach ile):\");\n        isimler.forEach(System.out::println);\n        \/\/ Lambda kar\u015f\u0131l\u0131\u011f\u0131: isimler.forEach(isim -> System.out.println(isim));\n\n        \/\/ 2. Statik metot referans\u0131 (Integer::sum)\n        List<Integer> sayilar = Arrays.asList(10, 20, 30, 40, 50);\n        int toplam = sayilar.stream().reduce(0, Integer::sum);\n        System.out.println(\"Say\u0131lar\u0131n toplam\u0131: \" + toplam);\n        \/\/ Lambda kar\u015f\u0131l\u0131\u011f\u0131: sayilar.stream().reduce(0, (a, b) -> Integer.sum(a, b));\n\n        \/\/ 3. Belirli bir t\u00fcrdeki rastgele bir nesnenin \u00f6rnek metodu referans\u0131 (String::toUpperCase)\n        List<String> buyukHarfIsimler = isimler.stream()\n                                             .map(String::toUpperCase)\n                                             .collect(Collectors.toList());\n        System.out.println(\"B\u00fcy\u00fck harf isimler: \" + buyukHarfIsimler);\n        \/\/ Lambda kar\u015f\u0131l\u0131\u011f\u0131: isimler.stream().map(isim -> isim.toUpperCase()).collect(Collectors.toList());\n\n        \/\/ 4. Kurucu metot referans\u0131 (ArrayList::new)\n        \/\/ Bu \u00f6rnek do\u011frudan listeyi kopyalamak i\u00e7in kullan\u0131lmaz, ancak Stream'in collect metoduyla birle\u015ftirilebilir.\n        \/\/ \u00d6rne\u011fin, bir stream'den yeni bir ArrayList olu\u015fturmak:\n        List<String> yeniIsimListesi = isimler.stream()\n                                             .collect(Collectors.toCollection(java.util.ArrayList::new));\n        System.out.println(\"Yeni isim listesi (kurucu referans\u0131 ile): \" + yeniIsimListesi);\n        \/\/ Lambda kar\u015f\u0131l\u0131\u011f\u0131: Collectors.toCollection(() -> new ArrayList());\n    }\n}<\/code><\/pre>\n<h3>8. Nashorn JavaScript Motoru<\/h3>\n<p>Java 8, Java uygulamalar\u0131n\u0131n i\u00e7inde JavaScript kodunu \u00e7al\u0131\u015ft\u0131rmak i\u00e7in yeni bir JavaScript motoru olan Nashorn&#8217;u tan\u0131tt\u0131. \u00d6nceki Rhino motorunun yerini alan Nashorn, daha iyi performans ve ECMAScript 5.1 uyumlulu\u011fu sunar. Bu \u00f6zellik, Java uygulamalar\u0131na dinamik komut dosyas\u0131 \u00e7al\u0131\u015ft\u0131rma veya yap\u0131land\u0131rma yetene\u011fi eklemek isteyen geli\u015ftiriciler i\u00e7in faydal\u0131d\u0131r.<\/p>\n<p><strong>\u00d6rnek:<\/strong> Nashorn ile JavaScript \u00e7al\u0131\u015ft\u0131rma<\/p>\n<pre><code class=\"language-java\">import javax.script.ScriptEngine;\nimport javax.script.ScriptEngineManager;\nimport javax.script.ScriptException;\n\npublic class NashornOrnek {\n    public static void main(String[] args) {\n        ScriptEngineManager manager = new ScriptEngineManager();\n        ScriptEngine engine = manager.getEngineByName(\"nashorn\"); \/\/ veya \"javascript\"\n\n        try {\n            \/\/ JavaScript kodunu \u00e7al\u0131\u015ft\u0131rma\n            engine.eval(\"print('Merhaba Nashorn!');\");\n\n            \/\/ De\u011fi\u015fken tan\u0131mlama ve kullanma\n            engine.eval(\"var isim = 'Java';\");\n            engine.eval(\"print('Ho\u015f geldin ' + isim + ' 8');\");\n\n            \/\/ Java objeleriyle etkile\u015fim\n            engine.put(\"sayi1\", 10);\n            engine.put(\"sayi2\", 20);\n            engine.eval(\"var toplam = sayi1 + sayi2;\");\n            System.out.println(\"JavaScript'ten gelen toplam: \" + engine.get(\"toplam\"));\n\n        } catch (ScriptException e) {\n            e.printStackTrace();\n        }\n    }\n}<\/code><\/pre>\n<h3>9. Paralel Dizi S\u0131ralama (Parallel Array Sorting)<\/h3>\n<p>Java 8, <code>java.util.Arrays<\/code> s\u0131n\u0131f\u0131na b\u00fcy\u00fck dizileri s\u0131ralamak i\u00e7in yeni <code>parallelSort()<\/code> metotlar\u0131n\u0131 ekledi. Bu metotlar, Fork\/Join \u00e7er\u00e7evesini kullanarak diziyi paralel alt dizilere b\u00f6ler ve bu alt dizileri ayr\u0131 ayr\u0131 i\u015fler. Bu, \u00f6zellikle \u00e7ok \u00e7ekirdekli i\u015flemcilerde b\u00fcy\u00fck veri setleri i\u00e7in \u00f6nemli performans iyile\u015ftirmeleri sa\u011flayabilir.<\/p>\n<p><strong>\u00d6rnek:<\/strong> <code>Arrays.parallelSort()<\/code> kullan\u0131m\u0131<\/p>\n<pre><code class=\"language-java\">import java.util.Arrays;\nimport java.util.Random;\n\npublic class ParallelSortOrnek {\n    public static void main(String[] args) {\n        int[] sayilar = new int[10000000]; \/\/ 10 milyon elemanl\u0131 bir dizi\n        Random random = new Random();\n\n        \/\/ Diziyi rastgele say\u0131larla doldur\n        for (int i = 0; i < sayilar.length; i++) {\n            sayilar[i] = random.nextInt(1000000);\n        }\n\n        \/\/ Kopyas\u0131n\u0131 olu\u015fturarak kar\u015f\u0131la\u015ft\u0131rma yapal\u0131m\n        int[] sayilarKopya = Arrays.copyOf(sayilar, sayilar.length);\n\n        \/\/ Geleneksel s\u0131ralama\n        long baslangicNormal = System.nanoTime();\n        Arrays.sort(sayilar);\n        long bitisNormal = System.nanoTime();\n        System.out.println(\"Normal s\u0131ralama s\u00fcresi: \" + (bitisNormal - baslangicNormal) \/ 1_000_000.0 + \" ms\");\n\n        \/\/ Paralel s\u0131ralama\n        long baslangicParallel = System.nanoTime();\n        Arrays.parallelSort(sayilarKopya);\n        long bitisParallel = System.nanoTime();\n        System.out.println(\"Paralel s\u0131ralama s\u00fcresi: \" + (bitisParallel - baslangicParallel) \/ 1_000_000.0 + \" ms\");\n\n        \/\/ Dizinin s\u0131ralan\u0131p s\u0131ralanmad\u0131\u011f\u0131n\u0131 kontrol etmek i\u00e7in (ilk birka\u00e7 eleman)\n        \/\/ System.out.println(\"S\u0131ralanm\u0131\u015f dizinin ilk 10 eleman\u0131: \" + Arrays.toString(Arrays.copyOfRange(sayilar, 0, 10)));\n        \/\/ System.out.println(\"Paralel s\u0131ralanm\u0131\u015f dizinin ilk 10 eleman\u0131: \" + Arrays.toString(Arrays.copyOfRange(sayilarKopya, 0, 10)));\n    }\n}<\/code><\/pre>\n<p>Bu \u00f6rnek, b\u00fcy\u00fck bir dizi \u00fczerinde <code>Arrays.sort()<\/code> ile <code>Arrays.parallelSort()<\/code> aras\u0131ndaki performans fark\u0131n\u0131 g\u00f6stermektedir. Performans fark\u0131, sistemin \u00e7ekirdek say\u0131s\u0131na ve dizinin boyutuna g\u00f6re de\u011fi\u015febilir.<\/p>\n<h3>Sonu\u00e7<\/h3>\n<p>Java 8, dilin geli\u015fiminde devrim niteli\u011finde bir ad\u0131md\u0131. Lambda ifadeleri, Stream API, fonksiyonel aray\u00fczler ve metot referanslar\u0131 gibi \u00f6zellikler, Java'ya fonksiyonel programlama yeteneklerini getirerek geli\u015ftiricilere daha \u00f6zl\u00fc, okunabilir ve verimli kod yazma imkan\u0131 sundu. <code>Optional<\/code> s\u0131n\u0131f\u0131 <code>NullPointerException<\/code> riskini azalt\u0131rken, yeni Date ve Time API'si tarih ve saat i\u015flemlerini \u00e7ok daha kolay ve g\u00fcvenli hale getirdi. Aray\u00fczlerdeki varsay\u0131lan metotlar, geriye d\u00f6n\u00fck uyumlulu\u011fu korurken aray\u00fczlerin evrimini kolayla\u015ft\u0131rd\u0131. Nashorn motoru ve paralel dizi s\u0131ralama gibi di\u011fer iyile\u015ftirmeler de platformun genel yeteneklerini art\u0131rd\u0131.<\/p>\n<p>Java 8'in getirdi\u011fi bu yenilikler, modern Java uygulamalar\u0131n\u0131n geli\u015ftirilmesinde temel ta\u015flar haline gelmi\u015f ve dilin gelecekteki evrimine y\u00f6n veren \u00f6nemli bir temel olu\u015fturmu\u015ftur. Her Java geli\u015ftiricisinin bu \u00f6zelliklere hakim olmas\u0131, daha kaliteli ve s\u00fcrd\u00fcr\u00fclebilir yaz\u0131l\u0131mlar \u00fcretmek i\u00e7in kritik \u00f6neme sahiptir.<\/p>\n<p><\/body><\/p>\n","protected":false},"excerpt":{"rendered":"Java 8 \u00d6zellikleri ve \u00d6rneklerle Detayl\u0131 Anlat\u0131m\nJava platformu, 2014 y\u0131l\u0131nda yay\u0131nlanan Java 8 ile \u00f6nemli bir d\u00f6n\u00fcm noktas\u0131na ula\u015ft\u0131.","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"csco_page_header_type":"","csco_page_load_nextpost":"","csco_page_subscribe_form":"","csco_page_contact_form":"","footnotes":""},"categories":[1408],"tags":[],"class_list":{"0":"post-33934","1":"post","2":"type-post","3":"status-publish","4":"format-standard","6":"category-java","7":"cs-entry","8":"cs-video-wrap"},"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v20.5 (Yoast SEO v25.3.1) - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Java 8 \u00d6zellikleri ve \u00d6rneklerle Detayl\u0131 Anlat\u0131m - Kodlar\u0131n Gizemli D\u00fcnyas\u0131<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/fatihsoysal.com\/blog\/java-8-ozellikleri-ve-orneklerle-detayli-anlatim\/\" \/>\n<meta property=\"og:locale\" content=\"tr_TR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Java 8 \u00d6zellikleri ve \u00d6rneklerle Detayl\u0131 Anlat\u0131m\" \/>\n<meta property=\"og:description\" content=\"Java 8 \u00d6zellikleri ve \u00d6rneklerle Detayl\u0131 Anlat\u0131m Java platformu, 2014 y\u0131l\u0131nda yay\u0131nlanan Java 8 ile \u00f6nemli bir d\u00f6n\u00fcm noktas\u0131na ula\u015ft\u0131.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/fatihsoysal.com\/blog\/java-8-ozellikleri-ve-orneklerle-detayli-anlatim\/\" \/>\n<meta property=\"og:site_name\" content=\"Kodlar\u0131n Gizemli D\u00fcnyas\u0131\" \/>\n<meta property=\"article:published_time\" content=\"2025-11-08T22:40:42+00:00\" \/>\n<meta name=\"author\" content=\"Fatih Soysal\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Yazan:\" \/>\n\t<meta name=\"twitter:data1\" content=\"Fatih Soysal\" \/>\n\t<meta name=\"twitter:label2\" content=\"Tahmini okuma s\u00fcresi\" \/>\n\t<meta name=\"twitter:data2\" content=\"16 dakika\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/java-8-ozellikleri-ve-orneklerle-detayli-anlatim\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/java-8-ozellikleri-ve-orneklerle-detayli-anlatim\/\"},\"author\":{\"name\":\"Fatih Soysal\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"headline\":\"Java 8 \u00d6zellikleri ve \u00d6rneklerle Detayl\u0131 Anlat\u0131m\",\"datePublished\":\"2025-11-08T22:40:42+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/java-8-ozellikleri-ve-orneklerle-detayli-anlatim\/\"},\"wordCount\":1571,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"articleSection\":[\"Java\"],\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/java-8-ozellikleri-ve-orneklerle-detayli-anlatim\/#respond\"]}],\"copyrightYear\":\"2025\",\"copyrightHolder\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/java-8-ozellikleri-ve-orneklerle-detayli-anlatim\/\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/java-8-ozellikleri-ve-orneklerle-detayli-anlatim\/\",\"name\":\"Java 8 \u00d6zellikleri ve \u00d6rneklerle Detayl\u0131 Anlat\u0131m - Kodlar\u0131n Gizemli D\u00fcnyas\u0131\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#website\"},\"datePublished\":\"2025-11-08T22:40:42+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/java-8-ozellikleri-ve-orneklerle-detayli-anlatim\/#breadcrumb\"},\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/java-8-ozellikleri-ve-orneklerle-detayli-anlatim\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/java-8-ozellikleri-ve-orneklerle-detayli-anlatim\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Anasayfa\",\"item\":\"https:\/\/fatihsoysal.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Java 8 \u00d6zellikleri ve \u00d6rneklerle Detayl\u0131 Anlat\u0131m\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#website\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/\",\"name\":\"Fatihsoysal.com\",\"description\":\"Blog - Yaz\u0131l\u0131m D\u00fcnyas\u0131 Tecr\u00fcbelerim\",\"publisher\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/fatihsoysal.com\/blog\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"tr\"},{\"@type\":[\"Person\",\"Organization\"],\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\",\"name\":\"Fatih Soysal\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"tr\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png\",\"contentUrl\":\"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png\",\"width\":512,\"height\":512,\"caption\":\"Fatih Soysal\"},\"logo\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/\"},\"description\":\"Kullan\u0131m ve kodlama m\u00fckemmeliyetini odak alan uygulamalar olu\u015fturma deneyimine sahip, profesyonel olarak 15+ y\u0131l \u00fczeri deneyime sahip bir yaz\u0131l\u0131m m\u00fchendisi.\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/author\/fatihsoysal\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Java 8 \u00d6zellikleri ve \u00d6rneklerle Detayl\u0131 Anlat\u0131m - Kodlar\u0131n Gizemli D\u00fcnyas\u0131","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/fatihsoysal.com\/blog\/java-8-ozellikleri-ve-orneklerle-detayli-anlatim\/","og_locale":"tr_TR","og_type":"article","og_title":"Java 8 \u00d6zellikleri ve \u00d6rneklerle Detayl\u0131 Anlat\u0131m","og_description":"Java 8 \u00d6zellikleri ve \u00d6rneklerle Detayl\u0131 Anlat\u0131m Java platformu, 2014 y\u0131l\u0131nda yay\u0131nlanan Java 8 ile \u00f6nemli bir d\u00f6n\u00fcm noktas\u0131na ula\u015ft\u0131.","og_url":"https:\/\/fatihsoysal.com\/blog\/java-8-ozellikleri-ve-orneklerle-detayli-anlatim\/","og_site_name":"Kodlar\u0131n Gizemli D\u00fcnyas\u0131","article_published_time":"2025-11-08T22:40:42+00:00","author":"Fatih Soysal","twitter_card":"summary_large_image","twitter_misc":{"Yazan:":"Fatih Soysal","Tahmini okuma s\u00fcresi":"16 dakika"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/fatihsoysal.com\/blog\/java-8-ozellikleri-ve-orneklerle-detayli-anlatim\/#article","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/java-8-ozellikleri-ve-orneklerle-detayli-anlatim\/"},"author":{"name":"Fatih Soysal","@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"headline":"Java 8 \u00d6zellikleri ve \u00d6rneklerle Detayl\u0131 Anlat\u0131m","datePublished":"2025-11-08T22:40:42+00:00","mainEntityOfPage":{"@id":"https:\/\/fatihsoysal.com\/blog\/java-8-ozellikleri-ve-orneklerle-detayli-anlatim\/"},"wordCount":1571,"commentCount":0,"publisher":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"articleSection":["Java"],"inLanguage":"tr","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/fatihsoysal.com\/blog\/java-8-ozellikleri-ve-orneklerle-detayli-anlatim\/#respond"]}],"copyrightYear":"2025","copyrightHolder":{"@id":"https:\/\/fatihsoysal.com\/blog\/#organization"}},{"@type":"WebPage","@id":"https:\/\/fatihsoysal.com\/blog\/java-8-ozellikleri-ve-orneklerle-detayli-anlatim\/","url":"https:\/\/fatihsoysal.com\/blog\/java-8-ozellikleri-ve-orneklerle-detayli-anlatim\/","name":"Java 8 \u00d6zellikleri ve \u00d6rneklerle Detayl\u0131 Anlat\u0131m - Kodlar\u0131n Gizemli D\u00fcnyas\u0131","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/#website"},"datePublished":"2025-11-08T22:40:42+00:00","breadcrumb":{"@id":"https:\/\/fatihsoysal.com\/blog\/java-8-ozellikleri-ve-orneklerle-detayli-anlatim\/#breadcrumb"},"inLanguage":"tr","potentialAction":[{"@type":"ReadAction","target":["https:\/\/fatihsoysal.com\/blog\/java-8-ozellikleri-ve-orneklerle-detayli-anlatim\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/fatihsoysal.com\/blog\/java-8-ozellikleri-ve-orneklerle-detayli-anlatim\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Anasayfa","item":"https:\/\/fatihsoysal.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Java 8 \u00d6zellikleri ve \u00d6rneklerle Detayl\u0131 Anlat\u0131m"}]},{"@type":"WebSite","@id":"https:\/\/fatihsoysal.com\/blog\/#website","url":"https:\/\/fatihsoysal.com\/blog\/","name":"Fatihsoysal.com","description":"Blog - Yaz\u0131l\u0131m D\u00fcnyas\u0131 Tecr\u00fcbelerim","publisher":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/fatihsoysal.com\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"tr"},{"@type":["Person","Organization"],"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1","name":"Fatih Soysal","image":{"@type":"ImageObject","inLanguage":"tr","@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/","url":"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png","contentUrl":"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png","width":512,"height":512,"caption":"Fatih Soysal"},"logo":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/"},"description":"Kullan\u0131m ve kodlama m\u00fckemmeliyetini odak alan uygulamalar olu\u015fturma deneyimine sahip, profesyonel olarak 15+ y\u0131l \u00fczeri deneyime sahip bir yaz\u0131l\u0131m m\u00fchendisi.","url":"https:\/\/fatihsoysal.com\/blog\/author\/fatihsoysal\/"}]}},"yoast_meta":{"yoast_wpseo_title":"","yoast_wpseo_metadesc":"","yoast_wpseo_canonical":""},"amp_enabled":true,"_links":{"self":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/33934","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/comments?post=33934"}],"version-history":[{"count":1,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/33934\/revisions"}],"predecessor-version":[{"id":33935,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/33934\/revisions\/33935"}],"wp:attachment":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/media?parent=33934"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/categories?post=33934"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/tags?post=33934"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}