从 Guava 到 Java 的可选转换

Optional conversion from Guava to Java

如何在不使用任何 if 语句的情况下将 Guava Optional 转换为 Java Optional?

if (maybeSomething.isPresent()) {
    return java.util.Optional.of(maybeSomething.get())
} else {
    return java.util.Optional.empty()
}

Optional javaOpt = Optional.ofNullable(guavaOpt.orNull());怎么样?

使用 guava 转换

maybeSomething
    .transform(java.util.Optional::of).or(java.util.Optional.empty());

这完全取决于您目前对 Guava 的 Optionals 的使用情况;第一个问题在于两者之间的差异。

其中:

  • Guava的Optional是abstract,Java8是final;
  • 番石榴上有的方法 Java 8 上没有,反之亦然。

这意味着你首先需要确定的是你对Guava的不同用法;这将决定您必须构建等效的 Java 8 的方式。

但考虑到两者 API 的差异,一些 if 似乎不可避免...

我个人的建议是一路走下去,用 Java 8 替换所有当前使用的 Guava;如果需要 "phaseout period",弃用必要的方法并在需要时提供它们,直到完全排除 Guava 的 Optional。

Guava Release 21 introduced the toJavaUtil and fromJavaUtil conversion methods to the Optional class.

javaUtilOptional = Optional.toJavaUtil(guavaOptional);
guavaOptional    = Optional.fromJavaUtil(javaUtilOptional);

在幕后,它似乎主要是按照 Kayaman 的回答中的建议实施的:

public java.util.Optional<T> toJavaUtil() {
    return java.util.Optional.ofNullable(orNull());
}

...

public static <T> Optional<T> fromJavaUtil(@Nullable java.util.Optional<T> javaUtilOptional) {
    return (javaUtilOptional == null) ? null : fromNullable(javaUtilOptional.orElse(null));
}