Arvojen 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änOptional-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 senull, jolloin syntyy joko arvolla täytetty tai tyhjäOptional.
Main.java
123456789101112131415package 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
12345678910package 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
123456789101112131415161718package 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
123456789101112131415package 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
123456789101112package 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
123456789101112package 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
123456789101112package 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?
Kiitos palautteestasi!
Kysy tekoälyä
Kysy tekoälyä
Kysy mitä tahansa tai kokeile jotakin ehdotetuista kysymyksistä aloittaaksesi keskustelumme
Awesome!
Completion rate improved to 2.33
Arvojen 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änOptional-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 senull, jolloin syntyy joko arvolla täytetty tai tyhjäOptional.
Main.java
123456789101112131415package 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
12345678910package 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
123456789101112131415161718package 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
123456789101112131415package 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
123456789101112package 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
123456789101112package 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
123456789101112package 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?
Kiitos palautteestasi!