// Creating Optionals
Optional<String> empty = Optional.empty();
Optional<String> present = Optional.of("Hello");
Optional<String> nullable = Optional.ofNullable(getString()); // may be null
// Checking presence
if (present.isPresent()) {
String value = present.get();
}
// Safe value extraction
String value1 = present.orElse("Default");
String value2 = present.orElseGet(() -> "Default");
String value3 = present.orElseThrow(() -> new RuntimeException("Not found"));
// Map transformation
Optional<Integer> length = present.map(String::length);
Optional<String> upper = present.map(String::toUpperCase);
// Filter
Optional<String> filtered = present.filter(s -> s.length() > 5);
// FlatMap (avoid Optional<Optional<T>>)
Optional<String> flatMapped = present.flatMap(s -> Optional.of(s.toUpperCase()));
// Conditional execution
present.ifPresent(System.out::println);
present.ifPresentOrElse(
System.out::println,
() -> System.out.println("Empty")
);
// Chaining operations
Optional<String> result = Optional.ofNullable(getString())
.filter(s -> !s.isEmpty())
.map(String::toUpperCase)
.orElse("DEFAULT");