A new class Optional in java.util package used to represent a value is present or absent, its main purpose it to keep us away from too many null checks and NullPointerExceptions
Advantages of using Java 8 Optional :
- No more NullPointerException at run-time.
- Develop clean and neat APIs.
- No more Boiler plate code.
- Null checks are not required.
Various methods in Optional object
1. Code to retrieve the wrapped value using get API
Optional<String> opt = Optional.of("programmertoday");
String name = opt.get();
2. Basic Methods from Optional
Optional.ofNullable() method : returns a Non-empty Optional if a value present in the given object. Otherwise returns empty Optional.
Optional.empty() method : useful to create an empty Optional object.
import java.util.Optional;
public class OptionalBasicExample {
public static void main(String[] args) {
Optional<String> gender = Optional.of("MALE");
String answer1 = "Yes";
String answer2 = null;
System.out.println("Non-Empty Optional:" + gender);
System.out.println("Non-Empty Optional: Gender value : " + gender.get());
System.out.println("Empty Optional: " + Optional.empty());
System.out.println("ofNullable on Non-Empty Optional: " + Optional.ofNullable(answer1));
System.out.println("ofNullable on Empty Optional: " + Optional.ofNullable(answer2)); // java.lang.NullPointerException System.out.println("ofNullable on Non-Empty Optional: " + Optional.of(answer2));
} }
Output:
Non - Empty Optional:
Optional[MALE]
Non - Empty Optional:
Gender value :MALE
Empty Optional:Optional.empty
ofNullable on Non - Empty Optional:
Optional[Yes]
ofNullable on Empty Optional:Optional.empty
Exception in thread "main" java.lang.NullPointerExceptio
at java.util.Objects.requireNonNull(Objects.java:203)
at java.util.Optional.<init> (Optional.java:96)
at java.util.Optional.of(Optional.java:108)
3. Optional – map and flatMap methods
Optional.ofNullable() method returns a Non-empty Optional if a value present in the given object. Otherwise returns empty Optional.
Optionaal.empty() method is useful to create an empty Optional object.
import java.util.Optional;
public class OptionalMapFlatMapExample {
public static void main(String[] args) {
Optional<String> nonEmptyGender = Optional.of("male");
Optional<String> emptyGender = Optional.empty();
System.out.println("Non-Empty Optional:: " + nonEmptyGender.map(String::toUpperCase));
System.out.println("Empty Optional :: " + emptyGender.map(String::toUpperCase));
Optional<Optional<String>> nonEmptyOtionalGender = Optional.of(Optional.of("male"));
System.out.println("Optional value :: " + nonEmptyOtionalGender);
System.out.println("Optional.map :: " + nonEmptyOtionalGender.map(gender -> gender.map(String::toUpperCase)));
System.out.println("Optional.flatMap :: " + nonEmptyOtionalGender.flatMap(gender -> gender.map(String::toUpperCase)));
}
}
Output:
Non-Empty Optional::Optional[MALE]
Empty Optional::Optional.empty
Optional value::Optional[Optional[male]]
Optional.map::Optional[Optional[MALE]]
Optional.flatMap::Optional[MALE]
4. Optional – filter method
import java.util.Optional;
public class OptionalFilterExample {
public static void main(String[] args) {
Optional<String> gender = Optional.of("MALE");
Optional<String> emptyGender = Optional.empty(); //Filter on Optional
System.out.println(gender.filter(g -> g.equals("male"))); //Optional.empty
System.out.println(gender.filter(g -> g.equalsIgnoreCase("MALE"))); //Optional[MALE]
System.out.println(emptyGender.filter(g -> g.equalsIgnoreCase("MALE"))); //Optional.empty
}
}
Output:
Optional.empty
Optional[MALE]
Optional.empty
5. Optional – isPresent and ifPresent methods
Optional.isPresent() returns true if the given Optional object is non-empty. Otherwise it returns false.
Optional.ifPresent() performs given action if the given Optional object is non-empty. Otherwise it returns false
import java.util.Optional;
public class OptionalIfPresentExample {
public static void main(String[] args) {
Optional<String> gender = Optional.of("MALE");
Optional<String> emptyGender = Optional.empty();
if (gender.isPresent()) {
System.out.println("Value available.");
} else {
System.out.println("Value not available.");
}
gender.ifPresent(g -> System.out.println("In gender Option, value available.")); //condition failed, no output print
emptyGender.ifPresent(g -> System.out.println("In emptyGender Option, value available."));
}
}
Output:
Value available.
In gender Option,value available.
6. Optional – orElse and orElseGet methods
It returns the value if present in Optional Container. Otherwise returns given default value.
import java.util.Optional;
public class OptionalOrElseExample {
public static void main(String[] args) {
Optional<String> gender = Optional.of("MALE");
Optional<String> emptyGender = Optional.empty();
System.out.println(gender.orElse("<N/A>")); //MALE
System.out.println(emptyGender.orElse("<N/A>")); //<N/A>
System.out.println(gender.orElseGet(() -> "<N/A>")); //MALE
System.out.println(emptyGender.orElseGet(() -> "<N/A>")); //<N/A>
}
}
Output:
MALE
<N/A>
MALE
<N /A>
Summary
In this article we learnt about Java 8 Optional package, its advantages and its variuos methods and implementations.
Hope you liked the article !