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.
Popular Backend topics










Other popular topics









Latest in Backend
Latest (all)
Categories:
My Saved Portals
-
None saved yet
Popular Portals
- /elixir
- /opensuse
- /rust
- /kotlin
- /ruby
- /erlang
- /python
- /clojure
- /react
- /quarkus
- /go
- /vapor
- /v
- /react-native
- /wasm
- /security
- /django
- /nodejs
- /centos
- /haskell
- /rails
- /fable
- /gleam
- /swift
- /js
- /deno
- /assemblyscript
- /tailwind
- /laravel
- /symfony
- /phoenix
- /crystal
- /typescript
- /debian
- /adonisjs
- /julia
- /arch-linux
- /svelte
- /spring
- /c-plus-plus
- /preact
- /flutter
- /actix
- /java
- /angular
- /ocaml
- /zig
- /kubuntu
- /scala
- /zotonic
- /vim
- /rocky
- /lisp
- /html
- /keyboards
- /vuejs
- /nim
- /emacs
- /nerves
- /elm