这是一个具有多个可能值的Guava可选项。
long numberToUse = Long.parseLong(Optional
.ofNullable(System.getenv(ENV_VAR))
.or(Optional.ofNullable(System.getProperty(PROP_VAR)))
.or("15"));
如何将其转换为干净的Java 8语法?
答案 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);