如何映射java.util.Optional <Something>到某些东西? 在Kotlin

我有一个方法返回java.util.Optional<Something> 。 我想从Kotlin中使用这种方法,而且我希望我的结果是Something? ,而不是Optional<Something>

如何在科特林,用惯用的方式做到这一点?

调用.orElse(null) on Optional给了我Something? 的确,但是看起来不太好。 Kotlin不会抱怨,如果我写val msg: Something = optional.orElse(null).msg被声明为Something ,而不是Something? – 我松散的编译类型检查)。

我使用Kotlin 1.0.3

用一种方法扩展java API展开Optional

 fun <T> Optional<T>.unwrap(): T? = orElse(null) 

然后像你想要的那样使用它:

 val msg: Something? = optional.unwrap() // the type is enforced 

有关详细信息,请参阅https://kotlinlang.org/docs/reference/extensions.html

orNull()更好。

例如,

 // Java public class JavaClass public Optional<String> getOptionalString() { return Optional.absent(); } } // Kotlin val optionalString = JavaClass().getOptionalString().orNull() 

orNull()的定义

 /** * Returns the contained instance if it is present; {@code null} otherwise. If the instance is * known to be present, use {@link #get()} instead. * * <p><b>Comparison to {@code java.util.Optional}:</b> this method is equivalent to Java 8's * {@code Optional.orElse(null)}. */ @Nullable public abstract T orNull();