Optional-olioiden luominen ja tarkastelu
Käytä metodeja Optional.of, ofNullable, empty, isPresent, isEmpty ja get turvallisesti.
Optional-olioiden luominen ja tarkastelu on ilmainen Java Academy-oppitunti CoddyKitissä. Tämä on oppitunti 2/4. Voit lukea koko oppitunnin alta ilmaiseksi ja harjoitella sen jälkeen käytännössä selaimessa sisäänrakennetulla koodieditorilla ja ympäri vuorokauden käytettävissä olevan tekoälytuutorin avulla. Oppitunti kuuluu Java Academy-oppimispolkuun, ja edistymisesi synkronoituu verkon ja CoddyKit-sovelluksen välillä. Java Academy-kurssilla on yhteensä 4 oppituntia.
Optional-olioiden luominen ja tarkastaminen
Tässä oppitunnissa käsitellään Optional-olioiden luomiseen ja niiden sisällön tarkastamiseen tarkoitettuja metodeja: isPresent, isEmpty, get ja turvalliset vaihtoehdot.
Kolme tapaa luoda Optional
Luokaa Optional käyttämällä metodia Optional.of(), Optional.ofNullable() tai Optional.empty().
import java.util.Optional;
// 1. of: must be non-null
Optional<String> a = Optional.of("hello");
// 2. ofNullable: safely wraps null
String maybeNull = null;
Optional<String> b = Optional.ofNullable(maybeNull); // empty
Optional<String> c = Optional.ofNullable("world"); // present
// 3. empty: explicitly empty
Optional<Integer> empty = Optional.empty();
System.out.println(a.isPresent()); // true
System.out.println(b.isPresent()); // false
System.out.println(c.isEmpty()); // falseisPresent ja isEmpty
isPresent() palauttaa arvon true, jos arvo on olemassa. isEmpty() (Java 11+) on sen looginen käänteisoperaatio.
import java.util.Optional;
Optional<String> opt = Optional.of("Java");
System.out.println(opt.isPresent()); // true
System.out.println(opt.isEmpty()); // false
Optional<String> empty = Optional.empty();
System.out.println(empty.isPresent()); // false
System.out.println(empty.isEmpty()); // true
// Prefer ifPresent() over if (isPresent()) get() — more readable
opt.ifPresent(v -> System.out.println(v.toUpperCase())); // JAVAget(): Käyttäkää varoen
get() palauttaa arvon tai heittää NoSuchElementException-poikkeuksen. Älkää koskaan kutsuko sitä tarkistamatta ensin arvon olemassaoloa.
import java.util.Optional;
Optional<String> opt = Optional.of("present");
System.out.println(opt.get()); // present
Optional<String> empty = Optional.empty();
try {
empty.get(); // NoSuchElementException!
} catch (java.util.NoSuchElementException e) {
System.out.println("No value!");
}
// Better pattern: always use orElse/orElseGet/orElseThrow
// instead of isPresent() + get()orElse ja orElseGet
orElse(default) palauttaa oletusarvon, jos Optional on tyhjä. orElseGet(supplier) kutsuu toimittajaa laiskasti — se on parempi vaihtoehto, kun oletusarvon laskeminen on kallista.
import java.util.Optional;
Optional<String> plan = Optional.empty();
// orElse: default value always evaluated
String basic = plan.orElse("FREE");
System.out.println(basic); // FREE
// orElseGet: supplier only called when empty (lazy)
String lazy = plan.orElseGet(() -> {
System.out.println("Computing default...");
return "FREE";
});
System.out.println(lazy); // Computing default... FREE
// When present, orElseGet supplier is NOT called
Optional.of("PRO").orElseGet(() -> {
System.out.println("Not called!");
return "FREE";
}); // silent — present, no computation neededorElseThrow
orElseThrow() heittää NoSuchElementException-poikkeuksen tai mukautetun poikkeuksen, jos Optional on tyhjä. Käyttäkää sitä, kun arvon puuttuminen on todella virhe.
import java.util.Optional;
Optional<String> userId = Optional.empty();
// Default: throws NoSuchElementException
try {
userId.orElseThrow();
} catch (java.util.NoSuchElementException e) {
System.out.println("Empty!");
}
// Custom exception
try {
userId.orElseThrow(() -> new IllegalStateException("User ID required"));
} catch (IllegalStateException e) {
System.out.println(e.getMessage()); // User ID required
}ifPresent ja ifPresentOrElse
Näiden metodien avulla voitte käsitellä arvoa poimimatta sitä Optional-oliosta. Ne sopivat hyvin sivuvaikutuksia varten.
import java.util.Optional;
Optional<String> username = Optional.of("alice");
// ifPresent: callback only when present
username.ifPresent(u -> System.out.println("Welcome, " + u));
// Welcome, alice
Optional<String> missing = Optional.empty();
// ifPresentOrElse (Java 9+): callback or else action
missing.ifPresentOrElse(
u -> System.out.println("Hello " + u),
() -> System.out.println("Anonymous user")
);
// Anonymous userString-arvon olemassaolon tarkistaminen
Yleinen käyttötapaus on oletusarvon palauttaminen, kun määritysmerkkijono puuttuu tai on tyhjä.
import java.util.Optional;
static Optional<String> getConfig(String key) {
// Simulate config lookup
return Optional.ofNullable(System.getenv(key));
}
String port = getConfig("PORT").orElse("8080");
String host = getConfig("HOST").orElse("localhost");
System.out.println("Server: " + host + ":" + port);
// Server: localhost:8080 (when env vars not set)Optional.or() vaihtoehtoisille Optional-olioille
or() (Java 9+) palauttaa saman Optional-olion, jos siinä on arvo, tai toimittajan tarjoaman toisen Optional-olion.
import java.util.Optional;
static Optional<String> findInCache(String key) { return Optional.empty(); }
static Optional<String> findInDatabase(String key) { return Optional.of("Alice"); }
Optional<String> result = findInCache("user:1")
.or(() -> findInDatabase("user:1"));
System.out.println(result.get()); // Alice
// Useful for fallback chains:
Optional<String> value = Optional.empty()
.or(() -> Optional.empty())
.or(() -> Optional.of("final fallback"));
System.out.println(value.get()); // final fallbackfilter ehdolliseen olemassaoloon
filter(predicate) säilyttää arvon vain, jos se täyttää predikaatin ehdon; muussa tapauksessa se palauttaa tyhjän Optional-olion.
import java.util.Optional;
Optional<Integer> age = Optional.of(17);
Optional<Integer> adult = age.filter(a -> a >= 18);
System.out.println(adult.isPresent()); // false (17 is not >= 18)
Optional<Integer> age2 = Optional.of(25);
Optional<Integer> adult2 = age2.filter(a -> a >= 18);
System.out.println(adult2.get()); // 25
// Chain: find active premium user
Optional<User> premiumActive = findUser(id)
.filter(u -> "PRO".equals(u.plan()))
.filter(u -> u.isActive());Käytännössä: käyttäjän haku varavaihtoehdolla
isPresent-, orElse- ja ifPresentOrElse-metodien yhdistäminen realistisessa käyttäjän hakutilanteessa.
import java.util.Optional;
record User(long id, String name, String email) {}
static Optional<User> findById(long id) {
return id == 1 ? Optional.of(new User(1, "Alice", "alice@co.com"))
: Optional.empty();
}
static void displayUser(long id) {
findById(id).ifPresentOrElse(
u -> System.out.println("Found: " + u.name() + " <" + u.email() + ">"),
() -> System.out.println("User " + id + " not found")
);
}
displayUser(1); // Found: Alice <alice@co.com>
displayUser(99); // User 99 not foundPikakysymys
Miten orElseGet() eroaa metodista orElse()?
Kertaus: Optional-olioiden luominen ja tarkastaminen
Keskeiset opit:
- Optional.of() edellyttää, ettei arvo ole null; Optional.ofNullable() hyväksyy null-arvon
- isPresent() / isEmpty() tarkistavat arvon olemassaolon; välttäkää get()-metodin kutsumista ilman tarkistusta
- orElse() sopii edullisiin oletusarvoihin; orElseGet() oletusarvoihin, joiden laskeminen on kallista
- orElseThrow() sopii tilanteisiin, joissa arvon puuttuminen on virhe
- ifPresent() ja ifPresentOrElse() sopivat sivuvaikutuksiin ilman arvon poimimista Optional-oliosta
- filter() säilyttää arvon vain, jos predikaatti hyväksyy sen; or() ketjuttaa varalla olevia Optional-olioita
Opi Java tekoälytuutorin avulla — ilmaiseksi
Kirjoita ja suorita oikeaa koodia selaimessa, saa välitöntä apua tekoälytuutorilta ympäri vuorokauden ja jatka siitä, mihin jäit, verkossa tai sovelluksessa.
- Kurssit
- 104
- Oppitunnit
- 374
Usein kysytyt kysymykset
Onko oppitunti ”Optional-olioiden luominen ja tarkastelu” ilmainen?
Kyllä – oppitunnin ”Optional-olioiden luominen ja tarkastelu” koko tekstin voi lukea täällä verkossa ilmaiseksi. Jos haluat harjoitella interaktiivisesti sisäänrakennetulla koodieditorilla ja ympäri vuorokauden käytettävissä olevan tekoälytuutorin avulla sekä avata koko Java Academy-kurssin, päivitä CoddyKit PROhon. Java Academy-kurssilla on yhteensä 4 oppituntia.
Mitä opin oppitunnilla ”Optional-olioiden luominen ja tarkastelu”?
Käytä metodeja Optional.of, ofNullable, empty, isPresent, isEmpty ja get turvallisesti. Harjoittelet Java Academy-aihetta koodilla, jonka suoritat suoraan selaimessa. Ympäri vuorokauden käytettävissä oleva tekoälytuutori vastaa kysymyksiisi oppitunnin aikana.
Tarvitsenko kokemusta aloittaakseni Java Academy-opiskelun?
Aiempi kokemus ei ole tarpeen. CoddyKitin Java Academy-oppimispolku sopii vasta-alkajista edistyneisiin, joten voit aloittaa tästä tai alusta ja edetä omaan tahtiisi. Tämä on oppitunti 2/4.
Kuinka kauan ”Optional-olioiden luominen ja tarkastelu”-oppitunnin suorittaminen kestää?
Useimmat CoddyKitin oppitunnit kestävät noin 5–10 minuuttia. Jokainen oppitunti on lyhyt ja interaktiivinen, joten edistyt tasaisesti ja voit jatkaa siitä, mihin jäit – sekä verkossa että sovelluksessa.
Voinko kirjoittaa ja suorittaa koodia tällä Java Academy-oppitunnilla?
Kyllä. Jokainen Java Academy-oppitunti sisältää sisäänrakennetun koodieditorin, joten voit kirjoittaa ja suorittaa oikeaa koodia suoraan selaimessa ja saada välitöntä palautetta tekoälyltä – paikallista asennusta ei tarvita.
Kaikki tämän kurssin oppitunnit
- Miksi Optional on olemassa
- Optional-olioiden luominen ja tarkastelu
- Optional-olioiden muuntaminen: map ja flatMap
- Optionalin parhaat käytännöt