prominent java 8 features with code examples
Java 8 Sürümünde Sunulan Tüm Öne Çıkan Özelliklerin Örneklerle Kapsamlı Bir Listesi ve Açıklaması:
Oracle'ın Java 8 sürümü, dünyanın 1 numaralı geliştirme platformunun devrim niteliğindeki bir sürümüdür. JVM, Java dili ve kitaplıkların koordineli bir şekilde evrilmesiyle birlikte bir bütün olarak Java programlama modeline büyük bir yükseltme içeriyordu.
Bu sürüm, Kullanım Kolaylığı, Üretkenlik, Geliştirilmiş Çok Dilli Programlama, Güvenlik ve Genel olarak iyileştirilmiş performans için çeşitli özellikler içeriyordu.
Ne öğreneceksin:
- Java 8 Sürümüne Eklenen Özellikler
- Fonksiyonel Arayüzler ve Lambda İfadeleri
- forEach () Yöntemi Yinelenebilir Arayüzde
- Opsiyonel Sınıf
- Arayüzlerde Varsayılan ve Statik Yöntemler
- Yöntem Referansları
- Koleksiyonlarda Toplu Veri İşlemleri için Java Stream API
- Java Date Time API
- Rhinoceros JavaScript motoru
- Base64 Encode Decode
- Koleksiyon API İyileştirmeleri
- Eş Zamanlılık API Değişiklikleri / Geliştirmeleri
- Java IO İyileştirmeleri
- Çeşitli Temel API İyileştirmeleri
- Sonuç
Java 8 Sürümüne Eklenen Özellikler
Önemli değişiklikler arasında, bu sürüme eklenen dikkate değer özellikler şunlardır.
- Fonksiyonel Arayüzler ve Lambda İfadeleri
- Yinelenebilir arabirimde forEach () yöntemi
- İsteğe bağlı sınıf,
- Arayüzlerde varsayılan ve statik yöntemler
- Yöntem referansları
- Koleksiyonlarda Toplu Veri İşlemleri için Java Stream API
- Java Date Time API
- Koleksiyon API iyileştirmeleri
- Eşzamanlılık API iyileştirmeleri
- Java IO iyileştirmeleri
- Rhinoceros JavaScript motoru
- Base64 Encode Decode
- Çeşitli Temel API iyileştirmeleri
Bu eğitimde, bu özelliklerin her birini kısaca tartışacağız ve her birini basit ve kolay örnekler yardımıyla açıklamaya çalışacağız.
Fonksiyonel Arayüzler ve Lambda İfadeleri
Java 8, genellikle derleyici düzeyinde hatalar için olan @ FunctionalInterface olarak bilinen bir ek açıklama sunar. Genellikle kullandığınız arayüz işlevsel arayüz sözleşmelerini ihlal ettiğinde kullanılır.
Alternatif olarak, işlevsel bir arabirimi SAM arabirimi veya Tek Soyut Yöntem arabirimi olarak çağırabilirsiniz. İşlevsel bir arayüz, üyesi olarak tam olarak bir 'soyut yönteme' izin verir.
Aşağıda bir İşlevsel Arayüz örneği verilmiştir:
@FunctionalInterface public interface MyFirstFunctionalInterface { public void firstWork(); }
Ek açıklamayı atlayabilirsiniz, @FunctionalInterface ve işlevsel arayüzünüz yine de geçerli olacaktır. Bu açıklamayı yalnızca derleyiciye arayüzün tek bir soyut yönteme sahip olacağını bildirmek için kullanıyoruz.
Not: Tanım olarak, varsayılan yöntemler Soyut değildir ve işlevsel arayüze istediğiniz kadar varsayılan yöntem ekleyebilirsiniz.
yönlendiricideki ağ güvenlik anahtarı nedir
İkinci olarak, bir arayüzün 'java.lang.object' genel yöntemlerinden birini geçersiz kılan soyut bir yöntemi varsa, arayüzün soyut yöntemi olarak kabul edilmez.
Aşağıda geçerli bir Fonksiyonel Arayüz örneği verilmiştir.
@FunctionalInterface public interface FunctionalInterface_one { public void firstInt_method(); @Override public String toString(); //Overridden from Object class @Override public boolean equals(Object obj); //Overridden from Object class }
Bir Lambda İfadesi (veya işlev), anonim bir işlev (adsız ve tanımlayıcı olmayan bir işlev) olarak tanımlanabilir. Lambda İfadeleri tam olarak ihtiyaç duyuldukları yerde, genellikle başka bir işlevin parametresi olarak tanımlanır.
Farklı bir perspektiften, Lambda İfadeleri, Fonksiyonel Arayüzler (Yukarıda tarif edilen). Lambda İfadeleri, işlevsel arayüzde bulunan tek soyut işlevi uygular ve böylece işlevsel arabirimleri uygular.
Bir Lambda İfadesinin temel sözdizimi şöyledir:
Lambda İfadesinin temel bir örneği:
Yukarıdaki ifade, iki x ve y parametresini alır ve toplamını x + y döndürür. X ve y veri türüne bağlı olarak, yöntem çeşitli yerlerde birden çok kez kullanılabilir. Böylece, x ve y parametreleri int veya Tamsayı ve dizeyle eşleşecek ve bağlama göre, iki tamsayı ekleyecektir (parametreler int olduğunda) veya iki dizgeyi birleştirecektir (parametreler bir dize olduğunda).
Lambda İfadelerini gösteren bir program uygulayalım.
interface MyInterface { void abstract_func(int x,int y); default void default_Fun() { System.out.println('This is default method'); } } class Main { public static void main(String args()) { //lambda expression MyInterface fobj = (int x, int y)->System.out.println(x+y); System.out.print('The result = '); fobj.abstract_func(5,5); fobj.default_Fun(); } }
Çıktı:
Yukarıdaki program, parametrelere eklemek için Lambda İfadesinin kullanımını gösterir ve bunların toplamını görüntüler. Daha sonra bunu arayüz tanımında belirttiğimiz soyut metodu “abstract_fun” uygulamak için kullanırız. 'Abstract_fun' işlevinin çağrılmasının sonucu, işlevi çağırırken parametre olarak geçirilen iki tam sayının toplamıdır.
Öğreticide daha sonra Lambda İfadeleri hakkında daha fazla bilgi edineceğiz.
forEach () Yöntemi Yinelenebilir Arayüzde
Java 8, java.lang.Iterable arayüzünde, koleksiyondaki öğeler üzerinde yineleme yapabilen bir 'forEach' yöntemi sunmuştur. 'ForEach', yinelenebilir arabirimde tanımlanan varsayılan bir yöntemdir. Öğeleri yinelemek için Yinelenebilir arabirimi genişleten Koleksiyon sınıfları tarafından kullanılır.
'ForEach' yöntemi, İşlevsel Arayüzü tek bir parametre olarak alır, yani Lambda İfadesini bir bağımsız değişken olarak iletebilirsiniz.
ForEach () yöntemi örneği.
importjava.util.ArrayList; importjava.util.List; public class Main { public static void main(String() args) { List subList = new ArrayList(); subList.add('Maths'); subList.add('English'); subList.add('French'); subList.add('Sanskrit'); subList.add('Abacus'); System.out.println('------------Subject List--------------'); subList.forEach(sub -> System.out.println(sub)); } }
Çıktı:
Bu yüzden bir konu koleksiyonumuz var, yani alt liste. Her bir öğeyi yazdırmak için Lambda Expression alan forEach yöntemini kullanarak subList içeriğini görüntüleriz.
Opsiyonel Sınıf
Java 8, 'java.util' paketinde isteğe bağlı bir sınıf getirmiştir. 'İsteğe bağlı' genel bir son sınıftır ve Java uygulamasında NullPointerException ile başa çıkmak için kullanılır. İsteğe Bağlı'yı kullanarak, çalıştırılacak alternatif kod veya değerler belirtebilirsiniz. İsteğe Bağlı'yı kullanarak, nullPointerException'ı önlemek için çok fazla boş denetim kullanmanız gerekmez.
Programın anormal şekilde sonlandırılmasını önlemek ve programın çökmesini önlemek için İsteğe Bağlı sınıfı kullanabilirsiniz. İsteğe Bağlı sınıf, belirli bir değişken için değerin varlığını kontrol etmek için kullanılan yöntemler sağlar.
Aşağıdaki program, İsteğe Bağlı sınıfın kullanımını gösterir.
import java.util.Optional; public class Main{ public static void main(String() args) { String() str = new String(10); OptionalcheckNull = Optional.ofNullable(str(5)); if (checkNull.isPresent()) { String word = str(5).toLowerCase(); System.out.print(str); } else System.out.println('string is null'); } }
Çıktı:
Bu programda, dizenin null olup olmadığını kontrol etmek için İsteğe Bağlı sınıfın “ofNullable” özelliğini kullanıyoruz. Eğer öyleyse, kullanıcıya uygun mesaj yazdırılır.
Arayüzlerde Varsayılan ve Statik Yöntemler
Java 8'de, arayüze soyut olmayan yöntemler ekleyebilirsiniz, yani yöntem uygulaması ile arayüzlere sahip olabilirsiniz. Yöntem uygulamasına sahip arabirimler oluşturmak için Default ve Static anahtar sözcüğünü kullanabilirsiniz. Varsayılan yöntemler esas olarak Lambda İfadesi işlevselliğini etkinleştirir.
Varsayılan yöntemleri kullanarak, kütüphanelerinizdeki arayüzlerinize yeni işlevler ekleyebilirsiniz. Bu, eski sürümler için yazılan kodun bu arayüzlerle uyumlu olmasını sağlayacaktır (ikili uyumluluk).
Varsayılan Yöntemi bir örnekle anlayalım:
import java.util.Optional; interface interface_default { default void default_method(){ System.out.println('I am default method of interface'); } } class derived_class implements interface_default{ } class Main{ public static void main(String() args){ derived_class obj1 = new derived_class(); obj1.default_method(); } }
Çıktı:
Varsayılan uygulamalı default_method () yöntemiyle 'interface_default' adlı bir arayüzümüz var. Daha sonra, 'interface_default' arayüzünü uygulayan bir 'türetilmiş sınıf' tanımlarız.
Bu sınıfta herhangi bir arayüz yöntemi uygulamadığımızı unutmayın. Daha sonra ana işlevde, 'türetilmiş_sınıf' sınıfından bir nesne yaratırız ve sınıfta tanımlamaya gerek kalmadan doğrudan arayüzün 'varsayılan_yöntemi' ni çağırırız.
Bu, arayüzde varsayılan ve statik yöntemlerin kullanılmasıdır. Ancak, bir sınıf varsayılan yöntemi özelleştirmek isterse, yöntemi geçersiz kılarak kendi uygulamasını sağlayabilirsiniz.
Yöntem Referansları
Java 8'de sunulan Yöntem başvurusu özelliği, Lambda İfadelerinin bir İşlevsel Arayüz yöntemini çağırması için kullanılan bir kısaltmadır. Dolayısıyla, bir yöntemi belirtmek için bir Lambda İfadesi kullandığınızda, Lambda İfadenizi yöntem başvurusuyla değiştirebilirsiniz.
Yöntem Referansı Örneği.
import java.util.Optional; interface interface_default { void display(); } class derived_class{ public void classMethod(){ System.out.println('Derived class Method'); } } class Main{ public static void main(String() args){ derived_class obj1 = new derived_class(); interface_default ref = obj1::classMethod; ref.display(); } }
Çıktı:
Bu programda, soyut bir yöntem olan 'display ()' ile 'interface_default' arayüzüne sahibiz. Ardından, bir mesajı yazdıran genel bir yöntem olan 'classMethod' a sahip bir 'türetilmiş sınıf' sınıfı vardır.
Ana işlevde, sınıf için bir nesnemiz var ve daha sonra obj1 (sınıf nesnesi) aracılığıyla bir 'classMethod' sınıf yöntemine başvuran arabirime bir referansımız var. Şimdi soyut yöntem görüntüsü arabirim başvurusu tarafından çağrıldığında, classMethod içeriği görüntülenir.
Koleksiyonlarda Toplu Veri İşlemleri için Java Stream API
Stream API, Java 8'de tanıtılan bir başka önemli değişikliktir. Stream API, nesnelerin koleksiyonunu işlemek için kullanılır ve farklı türde bir yinelemeyi destekler. Akış, istenen sonuçları üretmek için farklı yöntemleri ardışık düzene koymanıza olanak tanıyan nesneler (öğeler) dizisidir.
Bir Akış bir veri yapısı değildir ve girdisini koleksiyonlardan, dizilerden veya diğer kanallardan alır. Akışları kullanarak çeşitli ara işlemleri düzenleyebiliriz ve terminal işlemleri sonucu döndürür. Akış API'sini ayrı bir Java eğitiminde daha ayrıntılı olarak tartışacağız.
Java Date Time API
Java 8, java.time paketi altında yeni bir tarih-saat API'si sunar.
Aralarında en önemli sınıflar:
- Yerel: Zaman dilimi işlemenin karmaşıklığı olmadan basitleştirilmiş tarih-saat API'si.
- İmarlı: Çeşitli saat dilimleriyle ilgilenmek için özel tarih-saat API'si.
Tarih
Java 8'de tarih sınıfı geçersiz hale geldi.
Aşağıda tanıtılan yeni sınıflar verilmiştir:
- LocalDate sınıfı bir tarih tanımlar. Zaman veya zaman dilimi için temsili yoktur.
- LocalTime sınıf bir zamanı tanımlar. Tarih veya saat dilimi için bir temsili yoktur.
- LocalDateTime sınıfı bir tarih-saat tanımlar. Bir saat dilimini temsil etmez.
Tarih işlevselliğiyle birlikte saat dilimi bilgilerini dahil etmek için 3 sınıf, yani OffsetDate, OffsetTime ve OffsetDateTime sağlayan Lambda'yı kullanabilirsiniz. Burada Saat dilimi uzaklığı başka bir sınıf - 'ZoneId' kullanılarak temsil edilir. Bu Java serisinin sonraki bölümlerinde bu konuyu ayrıntılı olarak ele alacağız.
Rhinoceros JavaScript motoru
Java 8, JavaScript için çok geliştirilmiş bir motor, yani mevcut Rhino'nun yerini alan Nashorn'u tanıttı. Nashorn, kodu doğrudan bellekte derler ve ardından bayt kodunu JVM'ye geçirerek performansı 10 kat artırır.
Nashorn, konsolda JavaScript kodunu çalıştıran yeni bir komut satırı aracı olan jj'leri sunar.
Aşağıdaki kodu içeren bir 'sample.js' JavaScript dosyası oluşturalım.
print (‘Hello, World!!’);
Konsolda aşağıdaki komutu verin:
C: Java jjs sample.js
Çıktı: Selam Dünya!!
JavaScript programlarını etkileşimli modda da çalıştırabilir ve programlara argümanlar sağlayabiliriz.
Base64 Encode Decode
Java 8'de Base64 kodlaması için dahili kodlama ve kod çözme vardır. Base64 kodlaması için sınıf java.util.Base64'tür.
Bu sınıf, üç Base64 kodlama ve kod çözücü sağlar:
- Temel: Bunda çıktı, A-Za-z0-9 + / arasındaki bir dizi karaktere eşlenir. Kodlayıcı tarafından çıktıya satır beslemesi eklenmez ve kod çözücü yukarıdakilerden başka herhangi bir karakteri reddeder.
- URL: Burada çıktı URL'dir ve kasa adı A-Za-z0-9 + / arasındaki karakter kümesiyle eşleştirilmiştir.
- MIME: Bu tür kodlayıcıda, çıktı MIME uyumlu bir biçime eşlenir.
Koleksiyon API İyileştirmeleri
Java 8, Koleksiyon API'sine aşağıdaki yeni yöntemleri ekledi:
- forEachRemaining (Tüketici eylemi): Bu bir Varsayılan yöntemdir ve Yineleyici içindir. Tüm öğeler işlenene veya 'eylem' bir istisna atana kadar kalan öğelerin her biri için 'eylemi' gerçekleştirir.
- Koleksiyon için varsayılan yöntem removeIf (Tahmin filtresi): Bu, koleksiyondaki verilen 'filtreyi' karşılayan tüm öğeleri kaldırır.
- Spliterator (): Bu bir toplama yöntemidir ve öğeleri sıralı veya paralel şekilde çapraz geçiş yapmak için kullanabileceğiniz spliterator örneğini döndürür.
- Harita koleksiyonu replaceAll (), compute () ve merge () yöntemlerine sahiptir.
- Anahtar çarpışmalarına sahip HashMap sınıfı, performansı artırmak için geliştirildi.
Eş Zamanlılık API Değişiklikleri / Geliştirmeleri
Concurrent API'deki önemli geliştirmeler şunlardır:
- ConcurrentHashMap aşağıdaki yöntemlerle geliştirilmiştir:
- compute (),
- her biri için (),
- forEachEntry (),
- forEachKey (),
- forEachValue (),
- Git (),
- azalt () ve
- arama ()
- Yürütücüler için 'newWorkStealingPool ()' yöntemi bir iş çalma iş parçacığı havuzu oluşturur. Mevcut işlemcileri hedef paralellik düzeyi olarak kullanır.
- 'CompleteableFuture' yöntemi, açıkça tamamlayabileceğimiz yöntemdir (değerini ve durumunu ayarlayarak).
Java IO İyileştirmeleri
Java 8'de yapılan IO iyileştirmeleri şunları içerir:
- Files.list (Yol dizini): Bu, her bir öğesi dizindeki giriş olan göz alıcı bir şekilde doldurulmuş bir akış döndürür.
- Files.lines (Yol yolu): Bir akıştaki tüm satırları okur.
- Files.find (): Kökleri belirli bir başlangıç dosyasında olan dosya ağacındaki dosyaları arayın ve bir yolla doldurulmuş bir akış döndürür.
- BufferedReader.lines (): BufferedReader'dan okunan satırlar olarak her elemanına sahip bir akış döndürür.
Çeşitli Temel API İyileştirmeleri
Aşağıdaki çeşitli API geliştirmelerimiz var:
- Kolayca örnek oluşturmak için ThreadLocal'ın İlk (Tedarikçi tedarikçisi) ile statik yöntem.
- 'Karşılaştırıcı' arayüzü, doğal ters sıralama vb. İçin varsayılan ve statik yöntemlerle genişletilmiştir.
- Tamsayı, Uzun ve Çift sarmalayıcı sınıfları min (), max () ve sum () yöntemlerine sahiptir.
- Boolean sınıfı, logicalAnd (), logicalOr () ve logicalXor () yöntemleriyle geliştirilir.
- Math sınıfında çeşitli yardımcı yöntemler tanıtılmıştır.
- JDBC-ODBC Bridge kaldırıldı.
- PermGen hafıza alanı kaldırıldı.
Sonuç
Bu eğiticide, Java 8 sürümüne eklenen ana özellikleri tartıştık. Java 8, Java'nın büyük bir sürümü olduğundan, bu sürümün bir parçası olarak yapılan tüm özellikleri ve geliştirmeleri bilmeniz önemlidir.
En son Java sürümü 13 olmasına rağmen, Java 8 özelliklerini tanımak yine de iyi bir fikirdir. Bu eğitimde tartışılan tüm özellikler Java'nın en son sürümünde hala mevcuttur ve bunları bu dizinin ilerleyen bölümlerinde ayrı konular olarak tartışacağız.
Umarız bu eğitim, çeşitli Java 8 özelliklerini öğrenmenize yardımcı olur !!
Önerilen Kaynaklar
- Kod Örnekleriyle Java Dizi Uzunluğu Eğitimi
- Java 'bu' Anahtar Kelime: Kod Örnekleriyle Eğitim
- Java Arayüzü ve Örneklerle Soyut Sınıf Eğitimi
- Yeni Başlayanlar İçin JAVA Eğitimi: 100+ Uygulamalı Java Video Eğitimi
- Java Dağıtımı: Java JAR Dosyasının Oluşturulması ve Yürütülmesi
- C ++ Vs Java: Örneklerle C ++ ve Java Arasındaki İlk 30 Fark
- MongoDB Sort () Yöntemi Örneklerle
- Selenium'da Java'nın Temellerini Örneklerle Keşfedin