Haladó Java kurzus

Eredeti feladatsor

Folyam (stream)

A Stream osztály segítségével sokszor tömör megoldások adhatók. A legtöbbjük lambdákat használ. Cheat sheet.

Három fázis: a folyam elkészül, dolgozunk vele, majd felhasználjuk.

  1. Elkészítés.
  2. Átalakítás: map, mapTo..., filter, limit, skip, sorted

  3. Felhasználás: a Collectors műveletei segítségével. Ezeket a műveleteket (a JUnit assert-jeihez és a Mockito műveleteihez hasonlóan) gyakran import static importáljuk.

A műveletek, ha nem biztos, hogy van eredményük (pl. find), Optional<T>-t adnak vissza. Ez kevésbé veszélyes, mint ha null lenne ilyen esetekben az eredmény.

Az alábbi feladatok megoldása során, ahol csak lehet, használj folyamokat és lambdákat.

  1. Egy fájl mindegyik sorához fűzz hozzá egy rögzített szöveget, és az eredményt írd ki egy másik fájlba.
  2. Készíts lambdát, amely egy Scanner-t használ fel, és olyan folyamot készít, amely a Scanner-ből kiolvasott szavakat adja vissza.

    Tehát, ha a fájl tartalma

    What time is it?
    Adventure time!

    akkor a lambda által gyártott folyam tartalma (bal oldalon van a folyam eleje):

    "What" "time" "is" "it?" "Adventure" "time!"

    Vess egy pillantást a Steam.Builder-re, mellyel egyessével pakolhatjuk egy folyamba a szavakat.

  3. Tölts fel egy folyamot 0-ák és 1-esek sorozatával (a folyam egy számot ábrázol bináris számrendszerben). Váltsd vissza a számot tízes számrendszerbe.

    Ehhez le kell redukálni (össze kell hajtogatni) a számjegyeket egyetlen számmá.

  4. Készíts folyamot a nemnegatív számokból: 0..Integer.MAX_VALUE. Add őket össze.
  5. Készíts egy végtelen folyamot, mely a prímszámokat tartalmazza. Írass ki néhányat a képernyőre.

  6. Készíts eszközt, amit az alábbi módon lehet használni (st a Scannerből érkező tokenek folyama, tipp itt):

    withScanner("test.txt", st -> {
        st.forEach(System.out::println);
    });

    A withScanner arra jó, hogy lezárja a megnyitott fájlt, miután kiolvasta a tartalmát.

  7. Készíts egy alkalmazást, mely bekér egy szövegrészletet és egy könyvtárat, és megkeresi a könyvtárban az első olyan fájlt, melyben előfordul a szövegrészlet. Írasd ki a fájlnevet, ha talált ilyen fájlt.

    Érdemes megszemlézni a Files.find metódust.

  8. Készíts jelszót validáló folyamot. Tölts fel egy folyamot predikátumokkal, melyek megvizsgálnak egy-egy szempontot (legalább 6 karakter hosszú, vannak benne számok, vannak benne írásjelek, vannak benne nagybetűk). Azok lesznek az elfogadható jelszavak, melyek minden feltételnek megfelelnek. Próbáld ki néhány jelszóra.

  9. Készíts szavazatszámlálót. Egy listában szavazatok vannak (a feltett kérdés: melyik nyelvet kéne tanítani első félévben:

    "C" "C" "Java" "C++" "Python" "Java" "Python" "Python"

    a számláló összeszámolja, hogy melyik lehetőségre hány szavazat érkezett, és kiírja a legnépszerűbb választást.

  10. Egy fájlban egész számok vannak. Azokból, amelyek értéke legalább 2, collect segítségével készíts Map-et, amelyben a legkisebb prímosztóhoz lesznek rendelve a számokból képezett halmazok.

    Ha a fájl tartalma az alábbi:

    2 3 33 5 28 1 -5

    akkor a Map a következő legyen:

    Map(2 -> {2}, 3 -> {3, 33}, 4 -> {28}, 5 -> {5})