Working with Optional
1. Creating Optional
| Method | Detail |
|---|---|
Optional.of(value) | Throws NPE if null |
Optional.ofNullable(value) | Empty if null |
Optional.empty() | No value |
2. Checking Presence
| Method | Returns |
|---|---|
isPresent() | boolean |
isEmpty() JAVA 11+ | boolean |
ifPresent(c) | void |
ifPresentOrElse(c, runnable) JAVA 9+ | void |
3. Getting Values
| Method | Behavior |
|---|---|
get() | Throws if empty (avoid) |
orElse(default) | Eager default |
orElseGet(supplier) | Lazy default |
orElseThrow() | NoSuchElementException |
orElseThrow(supplier) | Custom exception |
4. Throwing Exceptions
Example: orElseThrow
User user = repo.findById(id)
.orElseThrow(() -> new UserNotFoundException(id));
| Pattern | Use |
|---|---|
| Specific exception | Service-layer not-found |
| Default exception | orElseThrow() |
5. Mapping Values
| Method | Use |
|---|---|
map(fn) | Transform if present |
flatMap(fn) | fn returns Optional |
6. Filtering Values
Example: filter
String name = Optional.ofNullable(input)
.filter(s -> !s.isBlank())
.map(String::trim)
.orElse("anonymous");
| Method | Detail |
|---|---|
filter(p) | Empty if predicate false |
7. Consuming Values
| Method | Use |
|---|---|
ifPresent(c) | Side-effect when present |
ifPresentOrElse(c, r) | Side-effect or fallback |
8. Chaining Operations
| Method | Detail |
|---|---|
or(supplier) JAVA 9+ | Alternative Optional |
map / flatMap | Transform chain |
9. Converting to Stream
| Method | Result |
|---|---|
opt.stream() JAVA 9+ | 0 or 1 element stream |
| Use case | list.stream().flatMap(Optional::stream) filters/unwraps |
10. Understanding Optional Best Practices
| Practice | Reason |
|---|---|
| Use as return type | Express absence in API |
| Don't use as field | Not Serializable; adds overhead |
| Don't use as parameter | Pass T or overload |
| No collection | Empty collection > Optional<List> |
11. Avoiding Optional Misuse
| Anti-pattern | Better |
|---|---|
opt.get() without check | orElseThrow / orElse |
if(opt.isPresent()){opt.get()} | opt.ifPresent(...) |
Optional.of(maybeNull) | Optional.ofNullable |