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:

  1. OOP, öröklődés és interfészek ( A Java Core küldetés 1-2. szintjei ).
  2. Alapértelmezett metódusmegvalósítások egy felületen .
  3. 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, Writerstb.?

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:

  1. Az BufferedReaderobjektum meghívja az objektum read()metódusátInputStreamReader
  2. Az InputStreamReaderobjektum meghívja az objektum read()metódusátFileInputStream
  3. Az FileInputStreamobjektum 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
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. Streaminterfész

A Java 8 kiterjesztett adatfolyam-támogatása az interfész segítségével valósul meg Stream<T>, ahol Tegy 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();
Adatfolyam lekérése egy gyűjteményből

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);
Adatfolyam lekérése tömbből

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.