Java Academy · Oppitunti

Optional-olioiden luominen ja tarkastelu

Käytä metodeja Optional.of, ofNullable, empty, isPresent, isEmpty ja get turvallisesti.

Oppitunti 2/413 vaihetta

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());   // false

isPresent 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())); // JAVA

get(): 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 needed

orElseThrow

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 user

String-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 fallback

filter 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 found

Pikakysymys

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
Aloita maksutta

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

  1. Miksi Optional on olemassa
  2. Optional-olioiden luominen ja tarkastelu
  3. Optional-olioiden muuntaminen: map ja flatMap
  4. Optionalin parhaat käytännöt
← Takaisin: Java Academy