Optional is a generic class defined in the java.util
package, that got introduced in Java 8.
It facilitates the handling of potentially absent values in a more concise and expressive manner.
It provides a container-like structure to wrap objects, indicating the possibility of a value being present or absent.
Its primary purpose is to provide a safer alternative to handling null values, thereby reducing the risk of NullPointerException. By explicitly acknowledging the possibility of an absent value, Optional encourages developers to write more robust and error-resistant code.
Without Optional (custom null check):
public String getStudentName() {
// can be null or non-null value
Student student = fetchStudent();
if(student != null){
return student.getName();
}else {
return null;
}
}
With Optional:
public Optional<String> getStudentName() {
// can be null or non-null value
Optional<Student> student = Optional.ofNullable(fetchStudent());
if(student.isPresent()){
return Optional.of(student.getName());
}
return Optional.empty();
}
Creating Optional Instances
To create an Optional instance, the following methods are provided:
Optional.of(T value)
:Creates an Optional object containing a non-null value.
Throws: NullPointerException if the value provided is null.
Example:
String name = "John Doe"; Optional<String> optionalName = Optional.of(name); System.out.println("Optional Name: " + optionalName);
Output:
Optional Name: Optional[John Doe]
Optional.ofNullable(T value)
:Creates an Optional object containing the specified value.
The value can be null, in that case, the Optional will be empty.
Example:
String city = null; Optional<String> optionalCity = Optional.ofNullable(city); System.out.println("Optional City: " + optionalCity);
Output:
Optional City: Optional.empty
Optional.empty()
:Creates an empty Optional object with no value/null value.
Example:
Optional<String> optionalEmail = Optional.empty(); System.out.println("Empty Optional Email: " + optionalEmail);
Output:
Empty Optional Email: Optional.empty
Methods and Usage:
Using the Optional instance, the following methods can be utilized to manipulate and retrieve values.
boolean isPresent()
:Returns true if the Optional contains a non-null value, otherwise returns false.
Example:
Optional<String> optionalName = Optional.of("John Doe"); if (optionalName.isPresent()) { System.out.println("Name: " + optionalName.get()); } else { System.out.println("No name found."); }
Output:
Name: John Doe
T get()
:Returns the value wrapped by the Optional if present.
Throws: NoSuchElementException if the Optional is empty.
Example:
Optional<String> optionalName = Optional.of("John Doe"); String name = optionalName.get(); System.out.println("Name: " + name);
Output:
Name: John Doe
T orElse(T defaultValue)
:Returns the value wrapped by the Optional if present.
Returns: defaultValue if the Optional is empty.
Example:
Optional<String> optionalCity = Optional.empty(); String city = optionalCity.orElse("Unknown City"); System.out.println("City: " + city);
Output:
City: Unknown City
T orElseGet(Supplier<? extends T> supplier)
:Returns the value wrapped by the Optional if present.
Invokes the supplier function to provide an alternative value if the Optional is empty.
Example:
Optional<String> optionalEmail = Optional.empty(); String email = optionalEmail.orElseGet(() -> "abc@def.com"); System.out.println("Email: " + email);
Output:
Email: abc@def.com
T orElseThrow(Supplier<? extends X> exceptionSupplier)
:Returns the value wrapped by the Optional if present.
Throws an exception produced by the exceptionSupplier if the Optional is empty.
Example:
Optional<String> optionalName = Optional.empty(); String name = optionalName.orElseThrow(() -> new IllegalArgumentException("Name is absent"));
Output:
Exception in thread "main" java.lang.IllegalArgumentException: Name is absent ..... .....
void ifPresent(Consumer<? super T> consumer)
:
Executes the specified consumer function with the value wrapped by the Optional if present.
Example:
Optional<String> optionalPhone = Optional.of("123456789"); optionalPhone.ifPresent(phone -> System.out.println("Phone: " + phone));
Output:
Phone: 123456789
Note:
when the value wrapped by anOptional
isnull
, it is equivalent to usingOptional.empty()
. Both represent an emptyOptional
object with no value.For example:
String value = null; Optional<String> optional1 = Optional.ofNullable(value); Optional<String> optional2 = Optional.empty(); System.out.println(optional1.equals(optional2)); //true
Both
Optional.empty()
andOptional.ofNullable(null)
are commonly used to handle cases where a value might be absent ornull
.
Conclusion:
Optional in Java is a valuable tool for handling potentially absent values without relying on null references and null checks.