Notice: This page requires JavaScript to function properly.
Please enable JavaScript in your browser settings or update your browser.
Oppiskele Arvojen Käsittely Optional-Luokan Avulla | Stream API:n Pääteoperaatiot
Stream API

bookArvojen Käsittely Optional-Luokan Avulla

Javassa oliotyyppiset muuttujat voivat sisältää arvon null. Tämä johtaa usein NullPointerException-virheeseen, jos null-arvoa ei käsitellä oikein. Tällaiset virheet heikentävät koodin luotettavuutta ja vaikeuttavat ylläpitoa. Tässä kohtaa Optional tulee avuksi.

Ajattele sitä laatikoksi—se voi sisältää arvon tai olla tyhjä. Sen sijaan, että käyttäisit if-lauseita tarkistaaksesi null-arvon, työskentelet tämän "laatikon" kanssa ja käytät käteviä metodeja arvon turvalliseen hakemiseen, jos se on olemassa.

Optional-luokan syntaksi ja käyttö

Optional-luokan päätavoitteena on välttää NullPointerException korvaamalla tavalliset if (value != null) -tarkistukset luettavammilla metodeilla.

Optional voidaan luoda kolmella tavalla:

  • Optional.empty() – luo tyhjän Optional-olion ilman arvoa;
  • Optional.of(value) – käärii annetun olion, mutta vain jos se on varmasti ei-null;
  • Optional.ofNullable(value) – käärii olion riippumatta siitä, onko se null, jolloin syntyy joko arvolla täytetty tai tyhjä Optional.
Main.java

Main.java

copy
123456789101112131415
package com.example; import java.util.Optional; public class Main { public static void main(String[] args) { Optional<String> emptyOpt = Optional.empty(); Optional<String> optWithValue = Optional.of("Laptop"); Optional<String> optNullable = Optional.ofNullable(null); System.out.println("Empty Optional: " + emptyOpt); System.out.println("Optional with value: " + optWithValue); System.out.println("Optional with null: " + optNullable); } }

Jos välität null arvoa metodille Optional.of(value), ohjelma heittää poikkeuksen NullPointerException, joten ofNullable()-metodia tulisi aina käyttää mahdollisesti tyhjille arvoille.

Arvojen hakeminen Optional-luokasta

Arvon poimimiseen Optional-oliosta voidaan käyttää get() metodia.

Main.java

Main.java

copy
12345678910
package com.example; import java.util.Optional; public class Main { public static void main(String[] args) { Optional<String> optWithValue = Optional.of("Laptop"); System.out.println("Final string: " + optWithValue.get()); } }

Tässä get() palauttaa varsinaisen olion, joka on tallennettu Optional-luokkaan. Jos kuitenkin Optional on tyhjä (sisältää null-arvon), get()-kutsun suorittaminen aiheuttaa NoSuchElementException-poikkeuksen.

Arvon tarkistaminen

Kun työskentelet Optional-luokan kanssa, sinun täytyy tarkistaa, sisältääkö se arvon. Yksi tapa tehdä tämä on käyttää isPresent()-metodia, joka palauttaa true, jos arvo on olemassa. Usein kuitenkin suositaan ifPresent()-metodia, joka suorittaa annetun lambda-lausekkeen vain, jos arvo on olemassa.

Main.java

Main.java

copy
123456789101112131415161718
package com.example; import java.util.Optional; public class Main { public static void main(String[] args) { Optional<String> productOpt = Optional.ofNullable(null); if (productOpt.isPresent()) { System.out.println("Product found: " + productOpt.get()); } else { System.out.println("Product not found."); } // A more concise approach productOpt.ifPresent(product -> System.out.println("Product: " + product)); } }

Ensimmäisessä esimerkissä tarkistetaan arvon olemassaolo manuaalisesti käyttämällä isPresent() ennen get()-kutsua. Toinen esimerkki poistaa if-lauseen tarpeen hyödyntämällä lambda-lauseketta, joka suoritetaan vain, jos tuote on olemassa.

Oletusarvon tarjoaminen

Joskus, kun arvo puuttuu, on hyvä palauttaa vaihtoehtoinen arvo. Tämä onnistuu orElse()-metodilla, joka antaa varmistusarvon. Jos varmistusarvon tuottaminen vaatii laskentaa, orElseGet() on tehokkaampi, sillä se suorittaa funktion vain tarvittaessa.

Main.java

Main.java

copy
123456789101112131415
package com.example; import java.util.Optional; public class Main { public static void main(String[] args) { Optional<String> productOpt = Optional.ofNullable(null); String product = productOpt.orElse("Default product"); System.out.println("Selected product: " + product); String productLazy = productOpt.orElseGet(() -> "Fallback product"); System.out.println("Selected product (lazy): " + productLazy); } }

Ero on siinä, että orElse() luo aina varavaihtoehdon, vaikka sitä ei tarvittaisi, kun taas orElseGet() kutsuu annettua funktiota vain, jos Optional on tyhjä.

Poikkeuksen heittäminen, jos arvo puuttuu

Joissakin tapauksissa arvon puuttuminen on virhe. Tällaisissa tilanteissa voidaan käyttää orElseThrow()-metodia poikkeuksen heittämiseen.

Main.java

Main.java

copy
123456789101112
package com.example; import java.util.Optional; public class Main { public static void main(String[] args) { Optional<String> productOpt = Optional.ofNullable(null); String product = productOpt.orElseThrow(() -> new RuntimeException("Product not found")); System.out.println("Product: " + product); } }

Tässä, jos Optional on tyhjä, ohjelma heittää RuntimeException-poikkeuksen. Tämä on hyödyllistä, kun puuttuva arvo tarkoittaa kriittistä virhettä.

Arvojen muuntaminen

Usein Optional sisältää monimutkaisia olioita, mutta saatat tarvita vain tiettyjä kenttiä. Tällöin käytetään map()-metodia, joka soveltaa annettua funktiota, jos arvo on olemassa.

Main.java

Main.java

copy
123456789101112
package com.example; import java.util.Optional; public class Main { public static void main(String[] args) { Optional<String> productOpt = Optional.ofNullable("Laptop"); Optional<Integer> nameLengthOpt = productOpt.map(String::length); nameLengthOpt.ifPresent(length -> System.out.println("Product name length: " + length)); } }

Jos Optional on tyhjä, map() palauttaa yksinkertaisesti Optional.empty(). Muussa tapauksessa se käyttää String::length ja palauttaa Optional<Integer>.

Arvojen suodatus

Joskus arvo täytyy säilyttää vain, jos se täyttää tietyn ehdon. filter()-metodi auttaa säilyttämällä arvon, jos annettu predikaatti palauttaa true, tai palauttamalla Optional.empty(), jos ehto ei täyty.

Main.java

Main.java

copy
123456789101112
package com.example; import java.util.Optional; public class Main { public static void main(String[] args) { Optional<String> productOpt = Optional.of("Laptop"); Optional<String> filteredProductOpt = productOpt.filter(name -> name.length() > 5); filteredProductOpt.ifPresent(name -> System.out.println("Filtered product: " + name)); } }

Jos merkkijonon pituus on yli 5, arvo säilytetään; muussa tapauksessa Optional muuttuu tyhjäksi.

1. Mitä tapahtuu, jos kutsut get() tyhjälle Optional:lle?

2. Mitä tämä koodi tulostaa?

3. Mikä on seuraavan koodin tulos?

4. Mikä menetelmä soveltuu parhaiten oletusarvon tarjoamiseen vain tarvittaessa?

question mark

Mitä tapahtuu, jos kutsut get() tyhjälle Optional:lle?

Select the correct answer

question mark

Mitä tämä koodi tulostaa?

Select the correct answer

question mark

Mikä on seuraavan koodin tulos?

Select the correct answer

question mark

Mikä menetelmä soveltuu parhaiten oletusarvon tarjoamiseen vain tarvittaessa?

Select the correct answer

Oliko kaikki selvää?

Miten voimme parantaa sitä?

Kiitos palautteestasi!

Osio 3. Luku 5

Kysy tekoälyä

expand

Kysy tekoälyä

ChatGPT

Kysy mitä tahansa tai kokeile jotakin ehdotetuista kysymyksistä aloittaaksesi keskustelumme

Awesome!

Completion rate improved to 2.33

bookArvojen Käsittely Optional-Luokan Avulla

Pyyhkäise näyttääksesi valikon

Javassa oliotyyppiset muuttujat voivat sisältää arvon null. Tämä johtaa usein NullPointerException-virheeseen, jos null-arvoa ei käsitellä oikein. Tällaiset virheet heikentävät koodin luotettavuutta ja vaikeuttavat ylläpitoa. Tässä kohtaa Optional tulee avuksi.

Ajattele sitä laatikoksi—se voi sisältää arvon tai olla tyhjä. Sen sijaan, että käyttäisit if-lauseita tarkistaaksesi null-arvon, työskentelet tämän "laatikon" kanssa ja käytät käteviä metodeja arvon turvalliseen hakemiseen, jos se on olemassa.

Optional-luokan syntaksi ja käyttö

Optional-luokan päätavoitteena on välttää NullPointerException korvaamalla tavalliset if (value != null) -tarkistukset luettavammilla metodeilla.

Optional voidaan luoda kolmella tavalla:

  • Optional.empty() – luo tyhjän Optional-olion ilman arvoa;
  • Optional.of(value) – käärii annetun olion, mutta vain jos se on varmasti ei-null;
  • Optional.ofNullable(value) – käärii olion riippumatta siitä, onko se null, jolloin syntyy joko arvolla täytetty tai tyhjä Optional.
Main.java

Main.java

copy
123456789101112131415
package com.example; import java.util.Optional; public class Main { public static void main(String[] args) { Optional<String> emptyOpt = Optional.empty(); Optional<String> optWithValue = Optional.of("Laptop"); Optional<String> optNullable = Optional.ofNullable(null); System.out.println("Empty Optional: " + emptyOpt); System.out.println("Optional with value: " + optWithValue); System.out.println("Optional with null: " + optNullable); } }

Jos välität null arvoa metodille Optional.of(value), ohjelma heittää poikkeuksen NullPointerException, joten ofNullable()-metodia tulisi aina käyttää mahdollisesti tyhjille arvoille.

Arvojen hakeminen Optional-luokasta

Arvon poimimiseen Optional-oliosta voidaan käyttää get() metodia.

Main.java

Main.java

copy
12345678910
package com.example; import java.util.Optional; public class Main { public static void main(String[] args) { Optional<String> optWithValue = Optional.of("Laptop"); System.out.println("Final string: " + optWithValue.get()); } }

Tässä get() palauttaa varsinaisen olion, joka on tallennettu Optional-luokkaan. Jos kuitenkin Optional on tyhjä (sisältää null-arvon), get()-kutsun suorittaminen aiheuttaa NoSuchElementException-poikkeuksen.

Arvon tarkistaminen

Kun työskentelet Optional-luokan kanssa, sinun täytyy tarkistaa, sisältääkö se arvon. Yksi tapa tehdä tämä on käyttää isPresent()-metodia, joka palauttaa true, jos arvo on olemassa. Usein kuitenkin suositaan ifPresent()-metodia, joka suorittaa annetun lambda-lausekkeen vain, jos arvo on olemassa.

Main.java

Main.java

copy
123456789101112131415161718
package com.example; import java.util.Optional; public class Main { public static void main(String[] args) { Optional<String> productOpt = Optional.ofNullable(null); if (productOpt.isPresent()) { System.out.println("Product found: " + productOpt.get()); } else { System.out.println("Product not found."); } // A more concise approach productOpt.ifPresent(product -> System.out.println("Product: " + product)); } }

Ensimmäisessä esimerkissä tarkistetaan arvon olemassaolo manuaalisesti käyttämällä isPresent() ennen get()-kutsua. Toinen esimerkki poistaa if-lauseen tarpeen hyödyntämällä lambda-lauseketta, joka suoritetaan vain, jos tuote on olemassa.

Oletusarvon tarjoaminen

Joskus, kun arvo puuttuu, on hyvä palauttaa vaihtoehtoinen arvo. Tämä onnistuu orElse()-metodilla, joka antaa varmistusarvon. Jos varmistusarvon tuottaminen vaatii laskentaa, orElseGet() on tehokkaampi, sillä se suorittaa funktion vain tarvittaessa.

Main.java

Main.java

copy
123456789101112131415
package com.example; import java.util.Optional; public class Main { public static void main(String[] args) { Optional<String> productOpt = Optional.ofNullable(null); String product = productOpt.orElse("Default product"); System.out.println("Selected product: " + product); String productLazy = productOpt.orElseGet(() -> "Fallback product"); System.out.println("Selected product (lazy): " + productLazy); } }

Ero on siinä, että orElse() luo aina varavaihtoehdon, vaikka sitä ei tarvittaisi, kun taas orElseGet() kutsuu annettua funktiota vain, jos Optional on tyhjä.

Poikkeuksen heittäminen, jos arvo puuttuu

Joissakin tapauksissa arvon puuttuminen on virhe. Tällaisissa tilanteissa voidaan käyttää orElseThrow()-metodia poikkeuksen heittämiseen.

Main.java

Main.java

copy
123456789101112
package com.example; import java.util.Optional; public class Main { public static void main(String[] args) { Optional<String> productOpt = Optional.ofNullable(null); String product = productOpt.orElseThrow(() -> new RuntimeException("Product not found")); System.out.println("Product: " + product); } }

Tässä, jos Optional on tyhjä, ohjelma heittää RuntimeException-poikkeuksen. Tämä on hyödyllistä, kun puuttuva arvo tarkoittaa kriittistä virhettä.

Arvojen muuntaminen

Usein Optional sisältää monimutkaisia olioita, mutta saatat tarvita vain tiettyjä kenttiä. Tällöin käytetään map()-metodia, joka soveltaa annettua funktiota, jos arvo on olemassa.

Main.java

Main.java

copy
123456789101112
package com.example; import java.util.Optional; public class Main { public static void main(String[] args) { Optional<String> productOpt = Optional.ofNullable("Laptop"); Optional<Integer> nameLengthOpt = productOpt.map(String::length); nameLengthOpt.ifPresent(length -> System.out.println("Product name length: " + length)); } }

Jos Optional on tyhjä, map() palauttaa yksinkertaisesti Optional.empty(). Muussa tapauksessa se käyttää String::length ja palauttaa Optional<Integer>.

Arvojen suodatus

Joskus arvo täytyy säilyttää vain, jos se täyttää tietyn ehdon. filter()-metodi auttaa säilyttämällä arvon, jos annettu predikaatti palauttaa true, tai palauttamalla Optional.empty(), jos ehto ei täyty.

Main.java

Main.java

copy
123456789101112
package com.example; import java.util.Optional; public class Main { public static void main(String[] args) { Optional<String> productOpt = Optional.of("Laptop"); Optional<String> filteredProductOpt = productOpt.filter(name -> name.length() > 5); filteredProductOpt.ifPresent(name -> System.out.println("Filtered product: " + name)); } }

Jos merkkijonon pituus on yli 5, arvo säilytetään; muussa tapauksessa Optional muuttuu tyhjäksi.

1. Mitä tapahtuu, jos kutsut get() tyhjälle Optional:lle?

2. Mitä tämä koodi tulostaa?

3. Mikä on seuraavan koodin tulos?

4. Mikä menetelmä soveltuu parhaiten oletusarvon tarjoamiseen vain tarvittaessa?

question mark

Mitä tapahtuu, jos kutsut get() tyhjälle Optional:lle?

Select the correct answer

question mark

Mitä tämä koodi tulostaa?

Select the correct answer

question mark

Mikä on seuraavan koodin tulos?

Select the correct answer

question mark

Mikä menetelmä soveltuu parhaiten oletusarvon tarjoamiseen vain tarvittaessa?

Select the correct answer

Oliko kaikki selvää?

Miten voimme parantaa sitä?

Kiitos palautteestasi!

Osio 3. Luku 5
some-alt