从Guava到Java的可选转换

Lib*_*e13 19 java optional guava

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

if (maybeSomething.isPresent()) {
    return java.util.Optional.of(maybeSomething.get())
} else {
    return java.util.Optional.empty()
}
Run Code Online (Sandbox Code Playgroud)

Mar*_*szS 30

使用番石榴改造

maybeSomething
    .transform(java.util.Optional::of).or(java.util.Optional.empty());
Run Code Online (Sandbox Code Playgroud)

  • 看到没有明显的技术理由在这个和@Kayaman的基于空的方法之间做出选择,我很好奇一个或另一个是否会显示出性能优势.我掀起了一些快速的性能测试,发现执行时间没有显着差异.进一步分析显示基于空的方法的显着更多(~2x)对象分配.所以,我认为这个答案肯定是最正确的. (3认同)

Hen*_*sen 20

番石榴21版推出toJavaUtilfromJavaUtil转换方法的Optional类.

在引擎盖下它似乎主要是作为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));
}
Run Code Online (Sandbox Code Playgroud)


Kay*_*man 15

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

  • 我不在乎问题多大了.¯\\ _(ツ)_ /¯ (7认同)
  • 至于"真正的"问题,我使用这个网站工作.我不只是拖着问题来回答(没有错 - 只是我通常没有时间).当我有需要时,我经常检查SO.如果我找不到我想要的东西,我会通过搞清楚,评论或回答来做出贡献. (3认同)
  • 请参阅我对@MariuszS 的回答的评论——此选项执行更多的对象分配。如果您正在处理大量调用,则替代答案虽然稍长一些(将其放入实用程序方法中并且不再查看它)将减少垃圾收集器的压力。 (2认同)
  • Guava的第21版包含用于在`java.util.Optional`和Guava的`Optional`之间进行转换的内置功能.他们似乎已经采用了这种方法.https://github.com/google/guava/blob/d9f088a61c80fa47d09ccf05a8c3608a47c5e4c0/guava/src/com/google/common/base/Optional.java#L129 (2认同)
  • @Henrik您应该添加它作为答案. (2认同)