In Java, the Optional class is a container object used to represent the existence or absence of a value. It was introduced in Java 8 to help developers handle cases where a result might be null without causing the dreaded NullPointerException.
In the context of your current step, here is why it’s being used:
1. Handling Empty Results
When you call .max() or .min() on a stream, there is a possibility that the list is empty.
- If the list is empty, there is no "maximum" number.
- Instead of returning
null, Java returns anOptional.empty().
2. Avoiding Null Checks
Without Optional, you would often have to write code like this:
Integer max = findMax(numbers);
if (max != null) {
System.out.println(max);
}
With Optional, the API clearly tells you: "This value might not be there, so you must handle that possibility."
3. Usage in your Lab
In your code:
Optional<Integer> maxNum = numbers.stream().max(Integer::compareTo);
System.out.println("Maximum number: " + maxNum.get());
maxNum.get(): This retrieves the value inside theOptional.- Warning: In a real-world application, calling
.get()directly without checking if a value exists is risky (it throws an exception if the value is missing).
Better ways to use Optional
Instead of .get(), you can use safer alternatives like:
isPresent(): Check if a value exists.orElse(defaultValue): Provide a fallback if the list is empty.System.out.println(maxNum.orElse(0)); // Prints 0 if list was emptyifPresent(consumer): Execute code only if a value is there.maxNum.ifPresent(System.out::println);
Think of Optional as a box: it might contain a gift, or it might be empty. You must check the box before you try to use the gift!