Tässä tehtävärepositoriossa perehdytään Javan stream-apiin sekä lambda-lausekkeisiin. Harjoitus on jaettu osiin, joista jokainen sisältää Java-luokan, jossa on keskeneräisiä metodeja. Tavoitteesi on täydentää näiden metodien logiikkaa käyttäen streameja ja lambdoja.
Suositellut itseopiskelumateriaalit:
- The Stream API (dev.java)
- Lambda Expressions in Java (Coding with John, YouTube)
- Optionals In Java (Coding with John, YouTube)
- The Java 8 Stream API Tutorial (baeldung.com)
Tämä tehtäväpaketti ei sisällä ns. "pääohjelmaa" (main
-metodia). Pääohjelman sijasta paketti sisältää jokaiselle tehtävän osalle omat JUnit-yksikkötestit. Testeihin perehtyminen ei ole tehtävän suorittamiseksi välttämätöntä, mutta testien suorittaminen on ehdottomasti suositeltua, jotta saat palautetta tekemiesi ratkaisujen toimivuudesta.
Voit suorittaa yksikkötestit koodieditorisi testaustyökalulla (VS Code, Eclipse) tai Gradle-automaatiotyökalulla. Halutessasi voit myös toteuttaa omia main
-metodeja, joiden avulla kokeilet ratkaisujesi toimivuutta.
💡 Saat kirjoittaa halutessasi lisää testejä, mutta älä muuta tai poista valmiiksi kirjoitettuja testejä.
💡 Tehtävänannossa määritettyjen metodien ja luokkien nimien, parametrien tai paluuarvojen muuttaminen ei ole sallittua testien toimivuuden varmistamiseksi.
Palauta tehtävä Gitin add
-, commit
- ja push
-komennoilla edellisten tehtävien tavoin. Voit lähettää ratkaisusi arvioitavaksi niin monta kertaa kuin on tarpeen tehtävän määräaikaan asti. Varmista kuitenkin, että viimeisin suoritus tuottaa parhaat pisteet, koska vain viimeisimmät pisteet jäävät voimaan.
Tässä osassa opit hyödyntämään Javan IntStream-luokan valmiita metodeja, jotka suorittavat tyypillisiä laskuoperaatioita striimeille, jotka sisältävät ainoastaan kokonaislukuja. Tehtävän tukena tarvitset mm. Javan dokumentaatiota.
Täydennä IntegerStreams
-luokassa olevat metodit niiden kommenttien ja vinkkien mukaisesti. Tehtävän tämä osa testataan IntegerStreamsTest
-testiluokalla, jonka voit suorittaa joko koodieditorisi testaustyökalulla, tai Gradlella:
./gradlew test --tests IntegerStreamsTest # unix
.\gradlew.bat test --tests IntegerStreamsTest # windows
Tässä osassa opit käsittelemään tilanteita, joissa stream ei välttämättä sisällä yhtään arvoa, mikä tulee huomioida esimerkiksi keskiarvoa tai ääriarvoja selvitettäessä. Java hyödyntää tällaisissa tilanteissa "optional"-olioita, joista voit lukea lisää Javan dokumentaatiosta: Optional, OptionalDouble ja OptionalInt.
Täydennä OptionalValues
-luokassa olevat metodit niiden kommenttien ja vinkkien mukaisesti. Tehtävän tämä osa testataan OptionalValuesTest
-testiluokalla, jonka voit suorittaa joko koodieditorisi testaustyökalulla tai Gradlella:
./gradlew test --tests OptionalValuesTest # unix
.\gradlew.bat test --tests OptionalValuesTest # windows
Tässä osassa opit luomaan striimejä listoista sekä muodostamaan listoja streameista.
Täydennä tiedostossa ListsAndStreams.java olevat metodit niiden kommenttien ja vinkkien mukaisesti. Tehtävän tämä osa testataan ListsAndStreamsTest.java-testiluokalla, jonka voit suorittaa joko koodieditorisi testaustyökalulla, tai Gradlella:
./gradlew test --tests ListsAndStreamsTest # unix
.\gradlew.bat test --tests ListsAndStreamsTest # windows
Tässä osassa opit muodostamaan uusia streameja muuntamalla olemassa olevan streamin arvoja. Muunnoksissa tarvitset operaatioita, jotka toteutetaan tyypillisesti lambda-lausekkeina.
Täydennä tiedostossa MappingStreams.java olevat metodit niiden kommenttien ja vinkkien mukaisesti. Tehtävän tämä osa testataan MappingStreamsTest.java-testiluokalla, jonka voit suorittaa joko koodieditorisi testaustyökalulla, tai Gradlella:
./gradlew test --tests MappingStreamsTest # unix
.\gradlew.bat test --tests MappingStreamsTest # windows
Hyvin tavallinen streamien käyttötapaus on aineiston suodattaminen eli filtteröinti. Tässä osassa opit suodattamaan striimeistä vain tietyt ehdot täyttävät arvot, jotka tulevat osaksi uutta striimiä.
Täydennä tiedostossa FilteringStreams.java olevat metodit niiden kommenttien ja vinkkien mukaisesti. Tehtävän tämä osa testataan FilteringStreamsTest.java-testiluokalla, jonka voit suorittaa joko koodieditorisi testaustyökalulla, tai Gradlella:
./gradlew test --tests FilteringStreamsTest # unix
.\gradlew.bat test --tests FilteringStreamsTest # windows
Tässä tehtävässä opit tarkastamaan koko striimiä koskevia ehtoja.
Täydennä tiedostossa PredicatesWithStreams.java olevat metodit niiden kommenttien ja vinkkien mukaisesti. Tehtävän tämä osa testataan PredicatesWithStreamsTest.java-testiluokalla, jonka voit suorittaa joko koodieditorisi testaustyökalulla, tai Gradlella:
./gradlew test --tests PredicatesWithStreamsTest # unix
.\gradlew.bat test --tests PredicatesWithStreamsTest # windows
Tässä osassa sovellamme Javan streameja oman Person-luokan kanssa. Tulet huomaamaan, että omien luokkien käsittely streameilla on lopulta hyvin samanlaista kuin Javan valmiiden tietotyyppien käsittely.
Täydennä tiedostossa ObjectStreams.java olevat metodit niiden kommenttien ja vinkkien mukaisesti. Tehtävän tämä osa testataan ObjectStreamsTest.java-testiluokalla, jonka voit suorittaa joko koodieditorisi testaustyökalulla, tai Gradlella:
./gradlew test --tests ObjectStreamsTest # unix
.\gradlew.bat test --tests ObjectStreamsTest # windows
Tässä osassa sovellamme oppimaamme ja muunnamme merkkijonoja Person-olioiksi ja toisin päin. Opimme myös tekemään soveltavia operaatioita, kuten kaikkien striimissä olevien henkilöiden iän kasvattamisen yhdellä vuodella.
Täydennä tiedostossa PersonStreams.java olevat metodit niiden kommenttien ja vinkkien mukaisesti. Tehtävän tämä osa testataan PersonStreamsTest.java-testiluokalla, jonka voit suorittaa joko koodieditorisi testaustyökalulla, tai Gradlella:
./gradlew test --tests PersonStreamsTest # unix
.\gradlew.bat test --tests PersonStreamsTest # windows
Tehtävän viimeisessä osassa käsittelemme Pizzoja ja pizzojen täytteitä streamien avulla. Keskitymme erityisesti ananakseen, joka on täytteenä erityisen kiistanalainen. Ohessa harjoittelemme soveltavia operaatioita, kuten streamien järjestämistä.
Täydennä tiedostossa PizzaStreams.java olevat metodit niiden kommenttien ja vinkkien mukaisesti. Tehtävän tämä osa testataan PizzaStreamsTest.java-testiluokalla, jonka voit suorittaa joko koodieditorisi testaustyökalulla, tai Gradlella:
./gradlew test --tests PizzaStreamsTest # unix
.\gradlew.bat test --tests PizzaStreamsTest # windows
Tämän tehtävän on kehittänyt Teemu Havulinna ja se on lisensoitu Creative Commons BY-NC-SA -lisenssillä.
Tehtävänannon, käsiteltävien tiedostojen sekä lähdekoodien toteutuksessa on hyödynnetty ChatGPT 3.5:ttä sekä GitHub copilot -tekoälyavustinta.