我有一个返回
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 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。
如果你使用
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();
看起来
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
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)
您可以使用 kotlin 构建
getOrNull