Optional の作成と確認
Optional.of、ofNullable、empty、isPresent、isEmpty、get を安全に使用します。
「Optional の作成と確認」はCoddyKit上の無料Java Academyレッスンです。 これはレッスン2/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはJava Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 Java Academyコースには全4レッスンが含まれています。
Optionalの作成と内容の確認
このレッスンでは、Optionalインスタンスを作成するメソッドと、その内容を確認するメソッドを扱います。対象はisPresent、isEmpty、get、および安全な代替方法です。
Optionalを作成する3つの方法
Optional.of()、Optional.ofNullable()、またはOptional.empty()を使ってOptionalを作成します。
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とisEmpty
isPresent()は、値が存在する場合にtrueを返します。isEmpty()(Java 11以降)は、その論理的な反対です。
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(): 注意して使用
get()は値を返しますが、値がない場合はNoSuchElementExceptionをスローします。事前に確認せず呼び出さないでください。
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とorElseGet
orElse(default)は、空の場合にデフォルト値を返します。orElseGet(supplier)はサプライヤーを遅延実行するため、計算コストの高いデフォルト値に適しています。
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()は、空の場合にNoSuchElementExceptionまたはカスタム例外をスローします。値がないことが本当にエラーである場合に使用してください。
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とifPresentOrElse
これらのメソッドを使うと、値を取り出さずに値に対する処理を実行できます。副作用を扱う場合に適しています。
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文字列の存在確認
よくある用途として、設定文字列が存在しない場合や空白の場合にデフォルト値を返す処理があります。
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のためのOptional.or()
or()(Java 9以降)は、値が存在する場合はそのOptional自体を返し、存在しない場合はサプライヤーから提供された別のOptionalを返します。
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
filter(predicate)は、値がpredicateを満たす場合にのみその値を保持し、それ以外の場合は空を返します。
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());実践: フォールバック付きのユーザー検索
現実的なユーザー検索のシナリオで、isPresent、orElse、ifPresentOrElseを組み合わせます。
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クイックチェック
orElseGet()は、orElse()とどのように異なりますか。
まとめ: Optionalの作成と内容の確認
要点:
- Optional.of()はnull以外の値を要求し、Optional.ofNullable()はnullを受け入れます
- isPresent() / isEmpty()で値の存在を確認します。確認せずにget()を呼び出すのは避けてください
- 計算コストの低いデフォルト値にはorElse()、高いデフォルト値にはorElseGet()を使用します
- 値がないことがエラーの場合はorElseThrow()を使用します
- 値を取り出さずに副作用を実行するには、ifPresent()とifPresentOrElse()を使用します
- filter()はpredicateを満たす場合のみ値を保持し、or()はフォールバックのOptionalを連結します
よくある質問
「Optional の作成と確認」レッスンは無料ですか?
はい。「Optional の作成と確認」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、Java Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 Java Academyコースには全4レッスンが含まれています。
「Optional の作成と確認」で何を学びますか?
Optional.of、ofNullable、empty、isPresent、isEmpty、get を安全に使用します。 ブラウザで直接実行するハンズオンコードでJava Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。
Java Academyを始めるのに経験は必要ですか?
事前経験は必要ありません。CoddyKitのJava Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン2/4です。
「Optional の作成と確認」レッスンにはどのくらい時間がかかりますか?
ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。
このJava Academyレッスンでコードを書いて実行できますか?
はい。すべてのJava Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。