2016-07-22 17 views
12

समस्या

Kotlin प्रकार प्रणाली में अशक्त-सुरक्षा की इस सीमा के आसपास काम करने का मुहावरेदार तरीका क्या है से nulls को खत्म?Kotlin: एक सूची (या अन्य कार्यात्मक परिवर्तन)

val strs1:List<String?> = listOf("hello", null, "world") 

// ERROR: Type Inference Failed: Expected Type Mismatch: 
// required: List<String> 
// round: List<String?> 
val strs2:List<String> = strs1.filter { it != null } 

यह सवाल नहीं है सिर्फ nulls को नष्ट करने, लेकिन यह भी प्रकार प्रणाली स्वीकार करते हैं कि nulls परिवर्तन द्वारा संग्रह से निकाल दिए जाते हैं बनाने के बारे में।

मैं लूप नहीं करना चाहूंगा, लेकिन अगर ऐसा करने का यह सबसे अच्छा तरीका है तो मैं करूँगा।

काम के आसपास

निम्नलिखित compiles, लेकिन मुझे यकीन है कि यह यह करने के लिए सबसे अच्छा तरीका है नहीं कर रहा हूँ:

fun <T> notNullList(list: List<T?>):List<T> { 
    val accumulator:MutableList<T> = mutableListOf() 
    for (element in list) { 
     if (element != null) { 
      accumulator.add(element) 
     } 
    } 
    return accumulator 
} 
val strs2:List<String> = notNullList(strs1) 

उत्तर

20

आप filterNotNull

यहाँ उपयोग कर सकते हैं एक सरल उदाहरण है:

val a: List<Int?> = listOf(1, 2, 3, null) 
val b: List<Int> = a.filterNotNull() 

लेकिन हुड के तहत, stdlib वही करता है जैसा आपने लिखा

/** 
* Appends all elements that are not `null` to the given [destination]. 
*/ 
public fun <C : MutableCollection<in T>, T : Any> Iterable<T?>.filterNotNullTo(destination: C): C { 
    for (element in this) if (element != null) destination.add(element) 
    return destination 
} 
+2

मीठे! रवींद्र! मैंने उसे क्यों नहीं देखा? :-) – GlenPeterson

+1

यदि आप सूची बना रहे हैं तो आप 'listOfNotNull' का भी उपयोग कर सकते हैं – Mijail

संबंधित मुद्दे