You may use nested orElse
:
long numberToUse = Long.parseLong(Optional
.ofNullable(System.getenv(ENV_VAR))
.orElse(
Optional.ofNullable(System.getProperty(PROP_VAR))
.orElse("15")));
Note that both in Guava and here the System.getProperty(PROP_VAR)
branch is executed even if it's unnecessary. To make it lazy use orElseGet
:
long numberToUse = Long.parseLong(Optional
.ofNullable(System.getenv(ENV_VAR))
.orElseGet(
() -> Optional.ofNullable(System.getProperty(PROP_VAR))
.orElse("15")));
Java-9 adds .or
method which makes the last sample simpler:
long numberToUse = Long.parseLong(Optional
.ofNullable(System.getenv(ENV_VAR))
.or(() -> Optional.ofNullable(System.getProperty(PROP_VAR)))
.orElse("15"));
As @BoristheSpider suggests, you can also move Long.parseLong
into optional pipeline:
long numberToUse = Optional
.ofNullable(System.getenv(ENV_VAR))
.or(() -> Optional.ofNullable(System.getProperty(PROP_VAR)))
.map(Long::parseLong)
.orElse(15L);
Finally it's possible to use Stream API instead (this works in Java-8 as well):
long numberToUse = Stream.of(System.getenv(ENV_VAR), System.getProperty(PROP_VAR))
.filter(Objects::nonNull).findFirst().map(Long::parseLong).orElse(15L);