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);
这是一个具有多个可能值的 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);