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

时间:2016-02-03 08:48:41

标签: java-8 guava optional

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

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

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

1 个答案:

答案 0 :(得分:7)

您可以使用嵌套的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);