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.
Stream.of
, Arrays.stream
), lista (myList.stream()
), fájl sorai
parallel()
.Supplier
segítségével: generate
iterate
, IntStream.range
IntStream
, és a kapcsolódó lambdák műveleteinek neve általában ...AsInt
Átalakítás: map
, mapTo...
, filter
, limit
, skip
, sorted
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.
forEach
to...
: tömb, lista, Map
min
, max
, find...
joining
count
anyMatch
, allMatch
, noneMatch
Map
-be csoportosítva: ...By
reduce
, collect
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.
"abcd"
-ből legyen "abcddcba"
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.
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á.
0..Integer.MAX_VALUE
. Add őket össze.
parallel()
hatására?Készíts egy végtelen folyamot, mely a prímszámokat tartalmazza. Írass ki néhányat a képernyőre.
Készíts eszközt, amit az alábbi módon lehet használni (st
a Scanner
bő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.
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.
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.
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.
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})