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:

  1. OOP, kalıtım ve arayüzler ( Java Core arayışında Seviye 1-2 ).
  2. Bir arabirimdeki varsayılan yöntem uygulamaları .
  3. İç 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, Writervs.

gibi veri kaynaklarından veri okuyan akış sınıfları ve ve FileInputSteamgibi diğer akışlardan veri okuyan ara veri akışları vardı .InputStreamReaderBufferedReader

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:

  1. Nesne , nesnedeki yöntemi BufferedReaderçağırırread()InputStreamReader
  2. Nesne , nesnedeki yöntemi InputStreamReaderçağırırread()FileInputStream
  3. Nesne dosyadanFileInputStream 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
ArrayList<String> list = new ArrayList<String>();
Collections.addAll(list, "Hello", "how's", "life?");
String max = list.stream().max((s1, s2)-> s1.length()-s2.length()).get();
ArrayList<String> list = new ArrayList<String>();
Collections.addAll(list, "Hello", "how's", "life?");
Stream<String> stream = list.stream();
Optional<String> optional = stream.max((s1, s2)-> s1.length()-s2.length());
String max = optional.get();

3. Streamarayü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. TBaş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();
Bir koleksiyondan akış alma

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);
Bir diziden akış alma

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.