1. Innovációk a Java 8-ban: Funkcionális programozás
A Java 8 kiadásával a nyelv erőteljes támogatást kapott a funkcionális programozáshoz . Akár azt is mondhatnánk, hogy régóta várt támogatást kapott a funkcionális programozáshoz. A kódolás gyorsabb lett, bár a kód nehezebben olvasható volt 🙂
Mielőtt megtanulná a funkcionális programozást Java nyelven, azt javasoljuk, hogy három dolgot értsen meg jól:
- OOP, öröklődés és interfészek ( A Java Core küldetés 1-2. szintjei ).
- Alapértelmezett metódusmegvalósítások egy felületen .
- Belső és névtelen osztályok .
A jó hír az, hogy mindezt nem kell tudnod ahhoz, hogy a Java funkcionális programozás számos funkcióját használhasd. A rossz hír az, hogy az anonim belső osztályok ismerete nélkül nehéz lesz pontosan megérteni, hogy minden hogyan van elrendezve, és hogyan működik minden.
A következő leckéken arra fogunk összpontosítani, hogy milyen könnyű és egyszerű a Java funkcionális programozási funkcióinak használata anélkül, hogy mélyrehatóan ismernénk a működését.
Hónapokba telik, hogy megértsük a Java funkcionális programozásának minden árnyalatát. Néhány óra alatt megtanulhatja az ilyen kódok olvasását. Ezért javasoljuk, hogy kezdje kicsiben. Még akkor is, ha I/O adatfolyamokkal.
2. I/O folyamok: stream pipelines
Emlékszel, hogy valaha régen tanultál az I/O adatfolyamokról: InputStream
, OutputStream
, Reader
, Writer
stb.?
Voltak adatfolyam-osztályok, amelyek adatforrásokból olvasnak adatokat , például FileInputSteam
, és voltak köztes adatfolyamok, amelyek más adatfolyamokból, például InputStreamReader
és BufferedReader
.
Ezeket a folyamokat adatfeldolgozási folyamatokba lehetne szervezni. Például így:
FileInputStream input = new FileInputStream("c:\\readme.txt");
InputStreamReader reader = new InputStreamReader(input);
BufferedReader buff = new BufferedReader(reader);
String text = buff.readLine();
Fontos megjegyezni, hogy a kód első néhány sorában csak egy objektumláncot építünk fel Stream
. Az adatok még nem mentek át a csővezetéken.
De amint meghívjuk a buff.readLine()
módszert, a következő történik:
- Az
BufferedReader
objektum meghívja az objektumread()
metódusátInputStreamReader
- Az
InputStreamReader
objektum meghívja az objektumread()
metódusátFileInputStream
- Az
FileInputStream
objektum elkezdi olvasni az adatokat a fájlból
Más szavakkal, nincs adatmozgás az adatfolyam-folyamat mentén, amíg el nem kezdjük az olyan módszereket, mint read()
a vagy readLine()
. A stream pipeline puszta megépítése nem vezet át rajta adatokat. Maguk a streamek nem tárolnak adatokat. Csak másoktól olvasnak.
Gyűjtemények és folyamok
A Java 8-tól kezdve lehetővé vált egy adatfolyam beszerzése a gyűjteményekből (és nem csak azokból) származó adatok olvasására. De nem ez a legérdekesebb. Valójában lehetővé vált az adatfolyamok összetett láncainak könnyű és egyszerű felépítése. És ennek során a korábban 5-10 soros kódot most 1-2 sorba lehetett írni.
Példa a leghosszabb karakterlánc megtalálására a karakterláncok listájában:
A leghosszabb húr megtalálása |
---|
|
|
3. Stream
interfész
A Java 8 kiterjesztett adatfolyam-támogatása az interfész segítségével valósul meg Stream<T>
, ahol T
egy típusparaméter, amely jelzi az adatfolyamban átadott adatok típusát. Más szavakkal, egy adatfolyam teljesen független attól, hogy milyen típusú adatokat továbbít.
Egy adatfolyam objektum gyűjteményből való lekéréséhez egyszerűen hívja meg a stream()
metódusát. A kód nagyjából így néz ki:
Stream<Type> name = collection.stream();
Ebben az esetben a gyűjteményt a folyam adatforrásának tekintjük, és az Stream<Type>
objektum eszköz lesz a gyűjteményből adatfolyam formájában történő adatok beszerzésére.
ArrayList<String> list = new ArrayList<String>();
Collections.addAll(list, "Hello", "how's", "life?");
Stream<String> stream = list.stream();
Mellesleg nem csak gyűjteményekből, hanem tömbökből is kaphat streamet . Ehhez a módszert kell használni. Például:Arrays.stream()
Stream<Type> name = Arrays.stream(array);
Ebben az esetben a tömb az adatfolyam adatforrása lesz name
.
Integer[] array = {1, 2, 3};
Stream<Integer> stream = Arrays.stream(array);
Stream<Type>
Az objektum létrehozásakor semmilyen adat nem kerül áthelyezésre . Egyszerűen beszereztünk egy stream objektumot, hogy elkezdhessünk egy folyam-csővezetéket.
GO TO FULL VERSION