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.
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("[email protected]")),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}