2016-08-04 12 views
8

में मेरे पास एक तरीका है जो java.util.Optional<Something> देता है। मैं Kotlin से कि विधि का उपयोग करना चाहते हैं, और मैं अपने परिणाम Something? होना चाहता हूँ, नहीं Optional<Something>java.util.Optional <Something> को कुछ कैसे मैप करें? कोटलिन

कैसे करने के लिए कि Kotlin में, मुहावरेदार तरह से?

.orElse(null)Optional पर Something? पर मुझे वास्तव में, लेकिन यह अच्छा नहीं लग रहा है। अगर मैं val msg: Something = optional.orElse(null). लिखता हूं (msgSomething के रूप में घोषित नहीं किया गया है, Something? नहीं - मैं संकलन-प्रकार की जांच को ढीला करता हूं) कोटलिन शिकायत नहीं करता है।

मैं Optional खोलने में एक विधि के साथ Kotlin 1.0.3

उत्तर

13

का उपयोग जावा एपीआई बढ़ाएँ: की तरह आप चाहते थे

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

kotlin-stdlib की परिभाषा है "या-अशक्त" कार्यों (जैसे 'firstOrNull',' lastOrNull', आदि)। आप "अनचाहे" के बजाय "orNull' का उपयोग करने पर विचार कर सकते हैं। – 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(); 
संबंधित मुद्दे