Guava Optional to Java 8 Optional with multiple choices

Guava Optional to Java 8 Optional with multiple choices

这是一个具有多个可能值的 Guava Optional。

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

如何将其转换为 nice clean Java 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);