如何将 java.util.Optional<Something> 映射到 Something?在科特林

问题描述 投票:0回答:5

我有一个返回

java.util.Optional<Something>
的方法。 我想使用 Kotlin 中的方法,并且我希望我的结果是
Something?
,而不是
Optional<Something>

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

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

我使用 Kotlin 1.0.3

java-8 kotlin option-type
5个回答
54
投票

使用解包方法扩展 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


7
投票

如果你使用

com.google.common.base.Optional
(Guava库)那么
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();

4
投票

看起来

java.util.Optional
支持将添加到 Kotlin 1.7 (KT-50484)。然后
optional.getOrNull()
就可以了。

另一个简洁的替代方案是使用 扩展属性

val <T> Optional<T>.value: T?
    get() = orElse(null)

用途:

val message: Something = optional.value ?: defaultMessage

1
投票

Kotlin 中的可空类型可以具有 value 或 null,因此您可以将 Optional 转换为可空类型,如下所示:

val str: SomeType? = Optional.of(SomeType_Value).map { it }.orElse(null)

例如,对于某些类型的字符串,我们有

val str: String? = Optional.of("someValue").map { it }.orElse(null)

© www.soinside.com 2019 - 2024. All rights reserved.