2016-08-04 68 views
8

我有一個方法返回java.util.Optional<Something>。 我想用這種方法從科特林,我想我的結果是Something?,不Optional<Something>如何映射java.util.Optional <Something>到某些東西?在Kotlin

如何做,在科特林,以慣用的方式?

致電.orElse(null)Optional的確給我Something?,但它看起來不太好。如果我寫val msg: Something = optional.orElse(null).msg宣佈爲Something,而不是Something? - 我鬆散的編譯型檢查),Kotlin不會抱怨。

我用科特林1.0.3

回答

13

擴展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詳細信息。

+3

科特林-STDLIB的定義有 「或空」 功能(例如'firstOrNull','lastOrNull'等)。你可能會考慮使用「orNull」而不是「unwrap」。 – mfulton26

1

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();