
finner
Using Optional in Java
During a recent code review I came across this scenario:
Code in review
if (input.getValue() != null) {
return Arrays.asList(value);
} else {
return input.getValues().stream().map(this::parseValues).collect(Collectors.toList())
}
And I suggested (in a compassionate way ) that we use
Optional
to treat the null
value, so my suggestion was something like:
return Optional.ofNullable(input.getValue()).map(Arrays::asList)
.orElseGet(input.getValues().stream().map(this::parseValues).collect(Collectors.toList()));
And I thought I was being very clever.
But then I realised it’s harder to understand the logic in this version. At least the if
is a clear intent.
So I read up some more on Optional
.
The Optional
container allows us to perform logic including chaining map
, flatMap
, filter
etc based on a value that may or may not be present. But this is not the real intention of Optional
.
Optional
is mainly used to represent attributes in an object that may be null
or a method in an API that could return a null
.
Consider a Person
.
Everyone has a name
, an age
and a gender
but may not have a car
so we could define a class as follows:
class Person {
private String name;
private int age;
private boolean female;
private Optional<Car> car;
}
From this declaration it’s obvious that not everyone has a car
and so the caller would then treat the car
attribute appropriately.
My take away is the following:
Optional
is not a replacement for occurrences if (x != null)
Any heavy users of Optional
around?
Tips and/or suggestions would be very much appreciated.
Most Liked

finner
Today I came across a very elegant use (IMHO) of Optional
at work.
Consider the same person as above with a date of birth attribute:
public class Person {
private String name;
private String dob;
// getters & setters etc etc (yep Java is verbose !!!!)
}
Now say you want to get that dob
value into a Date
object and do weird and wonderful date calculations.
You could use Optional
like this:
// if you expect dob to be a string in the format yyyy-mm-dd
LocalDate birthday = Optional.ofNullable(persone.getDob())
.map(LocalDate::parse)
.orElse(null); // or whatever
// or if the dob is in a different format, for example dd-MM-yyyy
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("dd-MM-yyyy");
LocalDate d = Optional.ofNullable(p.getDob())
.map(dob -> LocalDate.parse(dob, formatter))
.orElse(null);
Now you have a LocalDate
instance to play with.
In fact, once you have an Optional
instance you have the following stream operators available
map
flatMap
filter
flatMap
can be used to compose Optional
s
public int ageDifference(Optional<Person> older, Optional<Person> younger) {
return older.flatMap(o -> younger.map(y -> calAgeDifference(o.getDob(), y.getDob()));
}
Quite cool
Just thought I’d share

finner

AstonJ
I am just as bad - though I think a modern world is partly to blame - we are bombarded with information almost constantly now, imagine living a few thousand years ago before TV/Radio/Computers/Internet. Probably would have been quite serene and peaceful
Funny thing is I read that article… and forgot most of it
Popular Backend topics










Other popular topics










Latest in Backend
Latest (all)
Categories:
Popular Portals
- /elixir
- /rust
- /wasm
- /ruby
- /erlang
- /phoenix
- /keyboards
- /js
- /rails
- /python
- /security
- /go
- /swift
- /vim
- /clojure
- /java
- /haskell
- /emacs
- /svelte
- /onivim
- /typescript
- /crystal
- /c-plus-plus
- /tailwind
- /kotlin
- /gleam
- /react
- /flutter
- /elm
- /ocaml
- /vscode
- /opensuse
- /ash
- /centos
- /php
- /deepseek
- /zig
- /scala
- /html
- /debian
- /nixos
- /lisp
- /agda
- /sublime-text
- /textmate
- /react-native
- /kubuntu
- /arch-linux
- /ubuntu
- /revery
- /manjaro
- /spring
- /django
- /diversity
- /nodejs
- /lua
- /c
- /slackware
- /julia
- /neovim