Core Java

core23OptionalDemo

Path
pkg1core/core23OptionalDemo.java
Package
pkg1core
Study order
24
Run
Single-file source launch
Command
java pkg1core/core23OptionalDemo.java
Lesson
Back to the chapter

There is no in-browser runner. This is the file from the curriculum, unchanged.

pkg1core/core23OptionalDemo.java
1package pkg1core;2 3/*4 * core23OptionalDemo.java5 * -----------------6 * Optional<T>: model "value or absent" without null, and avoid NullPointerException.7 *8 * EXPLANATION:9 *  - Optional is a container that holds a value or nothing.10 *  - Prefer map/filter/flatMap + orElse/orElseThrow over isPresent()/get().11 *  - Use it as a RETURN type; don't use it for fields or method parameters.12 */13import java.util.*;14 15public class core23OptionalDemo {16 17    record User(String name, Optional<String> email) {}18 19    // A repository that may not find a user20    static Optional<User> findUser(int id) {21        Map<Integer, User> db = Map.of(22                1, new User("Alice", Optional.of("alice@x.com")),23                2, new User("Bob", Optional.empty()));24        return Optional.ofNullable(db.get(id));25    }26 27    public static void main(String[] args) {28        // Creating29        Optional<String> present = Optional.of("value");30        Optional<String> empty = Optional.empty();31        Optional<String> maybe = Optional.ofNullable(null);32        System.out.println("present=" + present + " empty=" + empty + " maybe=" + maybe);33 34        // orElse / orElseGet / orElseThrow35        System.out.println("orElse: " + empty.orElse("default"));36        System.out.println("orElseGet: " + empty.orElseGet(() -> "computed-default"));37 38        // map / filter chaining (no null checks)39        String upper = present.map(String::toUpperCase).filter(s -> s.length() > 2).orElse("n/a");40        System.out.println("mapped+filtered: " + upper);41 42        // ifPresent / ifPresentOrElse43        findUser(1).ifPresentOrElse(44                u -> System.out.println("found: " + u.name()),45                () -> System.out.println("no user"));46 47        // Nested Optional -> flatMap to avoid Optional<Optional<...>>48        String email = findUser(1).flatMap(User::email).orElse("no-email");49        System.out.println("user 1 email: " + email);50        System.out.println("user 2 email: " + findUser(2).flatMap(User::email).orElse("no-email"));51        System.out.println("user 9 email: " + findUser(9).flatMap(User::email).orElse("no-user/email"));52 53        // orElseThrow for required values54        try {55            findUser(99).orElseThrow(() -> new NoSuchElementException("user 99 missing"));56        } catch (NoSuchElementException e) {57            System.out.println("threw: " + e.getMessage());58        }59    }60}