Java Optional Class
Container object that may or may not contain a non-null value to avoid NullPointerException
java (8+)
2025-11-03
optional
null-safety
java8
functional
Description
The Optional class was introduced in Java 8 to provide a better way to handle potentially null values. It encourages explicit null handling and reduces the risk of NullPointerException.
Key Principles
- Never null: Optional itself should never be null
- Empty or present: An Optional either contains a value or is empty
- Functional operations: Provides map, filter, flatMap operations
- OrElse methods: Provide fallback values
Best Practices
- Use Optional for return types, not for fields or parameters
- Avoid nesting Optionals (Optional<Optional>)
- Don’t use Optional.get() without checking isPresent()
- Prefer orElse() and orElseGet() over get()
- Use Optional.empty() and Optional.of() appropriately
Code
import java.util.Optional;import java.util.function.*;public class OptionalUtils { // Safe value extraction public static <T> T getValue(Optional<T> optional, T defaultValue) { return optional.orElse(defaultValue); } // Safe value extraction with supplier public static <T> T getValue(Optional<T> optional, Supplier<T> supplier) { return optional.orElseGet(supplier); } // Throw exception if empty public static <T> T getValueOrThrow(Optional<T> optional, String message) { return optional.orElseThrow(() -> new IllegalArgumentException(message)); } // Map operation public static <T, R> Optional<R> map(Optional<T> optional, Function<T, R> mapper) { return optional.map(mapper); } // Filter operation public static <T> Optional<T> filter(Optional<T> optional, Predicate<T> predicate) { return optional.filter(predicate); } // FlatMap operation public static <T, R> Optional<R> flatMap(Optional<T> optional, Function<T, Optional<R>> mapper) { return optional.flatMap(mapper); } // Conditional execution public static <T> void ifPresent(Optional<T> optional, Consumer<T> action) { optional.ifPresent(action); } // Conditional execution with else public static <T> void ifPresentOrElse(Optional<T> optional, Consumer<T> action, Runnable emptyAction) { optional.ifPresentOrElse(action, emptyAction); }}
// Creating OptionalsOptional<String> empty = Optional.empty();Optional<String> present = Optional.of("Hello");Optional<String> nullable = Optional.ofNullable(getString()); // may be null// Checking presenceif (present.isPresent()) { String value = present.get();}// Safe value extractionString value1 = present.orElse("Default");String value2 = present.orElseGet(() -> "Default");String value3 = present.orElseThrow(() -> new RuntimeException("Not found"));// Map transformationOptional<Integer> length = present.map(String::length);Optional<String> upper = present.map(String::toUpperCase);// FilterOptional<String> filtered = present.filter(s -> s.length() > 5);// FlatMap (avoid Optional<Optional<T>>)Optional<String> flatMapped = present.flatMap(s -> Optional.of(s.toUpperCase()));// Conditional executionpresent.ifPresent(System.out::println);present.ifPresentOrElse( System.out::println, () -> System.out.println("Empty"));// Chaining operationsOptional<String> result = Optional.ofNullable(getString()) .filter(s -> !s.isEmpty()) .map(String::toUpperCase) .orElse("DEFAULT");
Comments
No comments yet. Be the first to comment!
Please login to leave a comment.