1. Java 8'deki Yenilikler: İşlevsel programlama
Java 8'in piyasaya sürülmesiyle dil, işlevsel programlama için güçlü bir destek kazandı . İşlevsel programlama için uzun zamandır beklenen desteği kazandığını bile söyleyebilirsiniz. Kodun okunması daha zor olmasına rağmen kodlama daha hızlı hale geldi 🙂
Java'da işlevsel programlamayı öğrenmeden önce , üç şeyi iyi anlamanızı öneririz:
- OOP, kalıtım ve arayüzler ( Java Core arayışında Seviye 1-2 ).
- Bir arabirimdeki varsayılan yöntem uygulamaları .
- İç ve anonim sınıflar .
İyi haber şu ki, Java'da işlevsel programlamanın birçok özelliğini kullanmak için tüm bunları bilmeniz gerekmiyor. Kötü haber şu ki, anonim iç sınıfları bilmeden her şeyin tam olarak nasıl düzenlendiğini ve nasıl çalıştığını anlamak zor olacak.
Gelecek derslerde, Java'nın işlevsel programlama özelliklerini, nasıl çalıştığını derinlemesine anlamadan kullanmanın ne kadar kolay ve basit olduğuna odaklanacağız.
Java'daki işlevsel programlamanın tüm nüanslarını anlamak aylar alır. Bu tür kodları okumayı birkaç saat içinde öğrenebilirsiniz. Bu yüzden küçük başlamanızı öneririz. G/Ç akışlarıyla olsa bile.
2. G/Ç akışları: akış boru hatları
Bir zamanlar I/O akışlarını öğrendiğinizi hatırlıyor musunuz: InputStream
, OutputStream
, Reader
, Writer
vs.
gibi veri kaynaklarından veri okuyan akış sınıfları ve ve FileInputSteam
gibi diğer akışlardan veri okuyan ara veri akışları vardı .InputStreamReader
BufferedReader
Bu akışlar, veri işleme boru hatları halinde organize edilebilir. Örneğin, bunun gibi:
FileInputStream input = new FileInputStream("c:\\readme.txt");
InputStreamReader reader = new InputStreamReader(input);
BufferedReader buff = new BufferedReader(reader);
String text = buff.readLine();
İlk birkaç kod satırında, sadece bir nesneler zinciri oluşturduğumuzu not etmek önemlidir Stream
. Veriler henüz boru hattından geçmedi.
Ancak yöntemi çağırır çağırmaz buff.readLine()
aşağıdakiler gerçekleşecektir:
- Nesne , nesnedeki yöntemi
BufferedReader
çağırırread()
InputStreamReader
- Nesne , nesnedeki yöntemi
InputStreamReader
çağırırread()
FileInputStream
- Nesne dosyadan
FileInputStream
veri okumaya başlar
read()
Başka bir deyişle, veya gibi yöntemleri çağırmaya başlayana kadar akış boru hattı boyunca veri hareketi olmaz readLine()
. Akış boru hattının yalnızca yapısı, içinden veri aktarmaz. Akışların kendileri veri depolamaz. Sadece diğerlerinden okurlar.
Koleksiyonlar ve akışlar
Java 8'den başlayarak, koleksiyonlardan (yalnızca onlardan değil) veri okumak için bir akış elde etmek mümkün hale geldi. Ama bu en ilginç şey değil. Karmaşık veri akış zincirlerini kolayca ve basit bir şekilde oluşturmak gerçekten mümkün hale geldi. Ve bunu yaparken daha önce 5-10 satır alan kod artık 1-2 satır yazılabilir hale geldi.
Dizeler listesindeki en uzun dizeyi bulma örneği:
En uzun diziyi bulma |
---|
|
|
3. Stream
arayüz
Java 8'in akışlar için genişletilmiş desteği, akışta geçirilen veri türünü belirten bir tür parametresinin bulunduğu Stream<T>
arabirim kullanılarak gerçekleştirilir. T
Başka bir deyişle, bir akış, geçtiği veri türünden tamamen bağımsızdır.
Bir koleksiyondan akış nesnesi almak için yöntemini çağırmanız yeterlidir stream()
. Kod kabaca şöyle görünür:
Stream<Type> name = collection.stream();
Bu durumda koleksiyon, akışın veri kaynağı olarak kabul edilecek ve nesne, Stream<Type>
koleksiyondan bir veri akışı biçiminde veri elde etmek için bir araç olacaktır.
ArrayList<String> list = new ArrayList<String>();
Collections.addAll(list, "Hello", "how's", "life?");
Stream<String> stream = list.stream();
Bu arada, sadece koleksiyonlardan değil, dizilerden de bir akış elde edebilirsiniz . Bunu yapmak için yöntemi kullanmanız gerekir . Örneğin:Arrays.stream()
Stream<Type> name = Arrays.stream(array);
Bu durumda dizi , adlı akış için veri kaynağı olarak kabul edilecektir name
.
Integer[] array = {1, 2, 3};
Stream<Integer> stream = Arrays.stream(array);
Nesne oluşturulduğunda hiçbir veri taşınmaz Stream<Type>
. Bir akış boru hattı oluşturmaya başlamak için basitçe bir akış nesnemiz var.
GO TO FULL VERSION