Guava是Java 8的可选项,可选择多种选择

hea*_*ach 3 optional guava java-8

这是一个具有多个可能值的Guava可选项.

long numberToUse = Long.parseLong(Optional
            .ofNullable(System.getenv(ENV_VAR))
            .or(Optional.ofNullable(System.getProperty(PROP_VAR)))
            .or("15"));
Run Code Online (Sandbox Code Playgroud)

如何将其转换为干净的Java 8语法?

Tag*_*eev 7

您可以使用嵌套orElse:

long numberToUse = Long.parseLong(Optional
    .ofNullable(System.getenv(ENV_VAR))
    .orElse(
        Optional.ofNullable(System.getProperty(PROP_VAR))
                .orElse("15")));
Run Code Online (Sandbox Code Playgroud)

请注意,在Guava和此处System.getProperty(PROP_VAR)分支都会被执行,即使它是不必要的.为了使它懒惰使用orElseGet:

long numberToUse = Long.parseLong(Optional
    .ofNullable(System.getenv(ENV_VAR))
    .orElseGet(
        () -> Optional.ofNullable(System.getProperty(PROP_VAR))
                .orElse("15")));
Run Code Online (Sandbox Code Playgroud)

Java-9添加了.or使最后一个样本更简单的方法:

long numberToUse = Long.parseLong(Optional
        .ofNullable(System.getenv(ENV_VAR))
        .or(() -> Optional.ofNullable(System.getProperty(PROP_VAR)))
        .orElse("15"));
Run Code Online (Sandbox Code Playgroud)

正如@BoristheSpider建议的那样,您也可以Long.parseLong进入可选管道:

long numberToUse = Optional
        .ofNullable(System.getenv(ENV_VAR))
        .or(() -> Optional.ofNullable(System.getProperty(PROP_VAR)))
        .map(Long::parseLong)
        .orElse(15L);
Run Code Online (Sandbox Code Playgroud)

最后,可以使用Stream API(这也适用于Java-8):

long numberToUse = Stream.of(System.getenv(ENV_VAR), System.getProperty(PROP_VAR))
    .filter(Objects::nonNull).findFirst().map(Long::parseLong).orElse(15L);
Run Code Online (Sandbox Code Playgroud)