从番石榴到Java的可选转换

从番石榴到Java的可选转换,java,guava,optional,Java,Guava,Optional,如何在不使用任何if语句的情况下,将Guava可选转换为Java可选 if (maybeSomething.isPresent()) { return java.util.Optional.of(maybeSomething.get()) } else { return java.util.Optional.empty() } 如何Optional javaOpt=Optional.ofNullable(guavaOpt.orNull())?使用番石榴变换 maybeSomet

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

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

如何
Optional javaOpt=Optional.ofNullable(guavaOpt.orNull())

使用番石榴变换

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

这完全取决于你目前使用的番石榴的选择;第一个问题在于两者之间的区别

除其他外:

  • 番石榴的可选是抽象的,Java8的是最终的
  • Guava上存在的方法在Java8上不存在,反之亦然
这意味着你首先需要确定的是你对番石榴的不同用法;这将限制您必须构建等效Java8的方式

但考虑到两者在API方面的差异,一些
if
s似乎是不可避免的

我个人的建议是,用Java8取代目前使用的番石榴;如果需要“淘汰期”,则不推荐必要的方法,并根据需要提供它们,直到完全排除番石榴的可选方法。

向类中介绍了和转换方法

在引擎盖下,它似乎主要按照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));
}
public java.util.Optional toJavaUtil(){
返回java.util.Optional.ofNullable(orNull());
}
...
public static Optional fromJavaUtil(@Nullable java.util.Optional javaUtilOptional){
return(javaUtilOptional==null)?null:fromNullable(javaUtilOptional.orElse(null));
}

需要更多上下文信息;您的代码库是否广泛使用Guava的可选代码?您打算如何用Java8取代它?您目前如何使用番石榴的可选配方?您是否希望在Stream的.findAny()中使用现有实例?您首先需要一个迁移策略,您将如何使用if语句来实现它?你试过什么吗?api迁移没有一般问题,只有一个案例我需要这样的转换。不是我投了反对票,但你似乎没有真正解决这个问题,而是很好地概述了优点,两种可用的
可选-实现之间的缺点和差异。鉴于没有明显的技术理由在这两种实现与@Kayaman基于空的方法之间进行选择,我很好奇其中一种是否会显示出性能优势。我快速进行了一些性能测试,结果发现执行时间没有显著差异。进一步的分析表明,对于基于null的方法,对象分配要多得多(~2x)。因此,我认为这个答案绝对是最正确的。请参阅我对@MariuszS答案的评论——这个选项执行更多的对象分配。如果你处理的是大量的呼叫,那么另一个答案虽然稍微长一点(放在实用方法中,不要再看它),但会减轻垃圾收集器的负担。我不在乎问题有多老。¯\_(ツ)_/’至于“真正的”问题,我使用这个网站是为了工作。我不只是为了回答问题而四处闲逛(这没什么错——只是我通常没有时间去做)。当我有需要时,我经常检查。如果我找不到我要找的东西,我会做出贡献,找出答案并做出相应的评论或回答。Guava的21版包含内置的功能,用于在
java.util.Optional
和Guava的
Optional
之间进行转换。他们似乎已经采用了这种方法。@Henrik You's应该加上这个作为答案。
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));
}