3

This is a Guava Optional with multiple possible values.

long numberToUse = Long.parseLong(Optional
            .ofNullable(System.getenv(ENV_VAR))
            .or(Optional.ofNullable(System.getProperty(PROP_VAR)))
            .or("15"));

How can this converted to nice clean Java 8 syntax?

heaphach
  • 1,492
  • 1
  • 20
  • 44

1 Answers1

8

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);
Tagir Valeev
  • 97,161
  • 19
  • 222
  • 334