如何将java.util.Optional <Something>映射到Something?在Kotlin

Bar*_*cki 10 optional java-8 kotlin

我有一个返回的方法java.util.Optional<Something>.我想从Kotlin那里使用那个方法,我希望我的结果Something?不是Optional<Something>

如何以惯用的方式在Kotlin做到这一点?

.orElse(null)Optional给我Something?确实的,但它并不好看.如果我写的话,Kotlin不会抱怨 val msg: Something = optional.orElse(null).(msg声明为 Something,而不是Something?- 我松散编译类型检查).

我用Kotlin 1.0.3

vod*_*dan 22

使用解包方法扩展java API Optional:

fun <T> Optional<T>.unwrap(): T? = orElse(null)
Run Code Online (Sandbox Code Playgroud)

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

val msg: Something? = optional.unwrap()  // the type is enforced
Run Code Online (Sandbox Code Playgroud)

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

  • kotlin-stdlib具有"or-null"函数(例如`firstOrNull`,`lastOrNull`等).您可以考虑使用"orNull"而不是"unwrap". (4认同)

Jak*_*Lin 5

orNull() 更好。

例如,

// Java
public class JavaClass
  public Optional<String> getOptionalString() {
    return Optional.absent();
  }
}

// Kotlin
val optionalString = JavaClass().getOptionalString().orNull()
Run Code Online (Sandbox Code Playgroud)

的定义 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();
Run Code Online (Sandbox Code Playgroud)

  • 这对于 Guava 的 com.google.common.base.Optional 有好处。java.util.Optional 没有 orNull() 方法。 (2认同)