// 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");