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