使用多种选择将Guava可选项转换为Java 8可选项

3
这是一个具有多个可能值的Guava Optional。
long numberToUse = Long.parseLong(Optional
            .ofNullable(System.getenv(ENV_VAR))
            .or(Optional.ofNullable(System.getProperty(PROP_VAR)))
            .or("15"));

如何将此转换为漂亮干净的Java 8语法?


1
请参见https://dev59.com/8F4b5IYBdhLWcg3wrzXY - Misha
1个回答

8

您可以使用嵌套的 orElse

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

请注意,无论是在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")));

Java-9增加了.or方法,使得最后一个示例更简单:

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

如@BoristheSpider所建议的,你也可以将Long.parseLong移入可选管道:

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

最后,现在可以使用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);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接