यहां कुछ विविधताएं हैं, इस बात पर निर्भर करता है कि आप किस शैली का उपयोग करना चाहते हैं, यदि आपके पास एक ही या अलग-अलग प्रकार की चीजें हैं, और यदि सूची में अज्ञात संख्या है ...
मिश्रित प्रकार, सभी को एक नए मूल्य की गणना करने के लिए अशक्त नहीं होना चाहिए
मिश्रित प्रकारों के लिए आप प्रत्येक पैरामीटर गणना के लिए फ़ंक्शंस की एक श्रृंखला बना सकते हैं जो मूर्खतापूर्ण लग सकती है, लेकिन मिश्रित प्रकारों के लिए अच्छी तरह से काम करें:
inline fun <T1: Any, T2: Any, R: Any> safeLet(p1: T1?, p2: T2?, block: (T1, T2)->R?): R? {
return if (p1 != null && p2 != null) block(p1, p2) else null
}
inline fun <T1: Any, T2: Any, T3: Any, R: Any> safeLet(p1: T1?, p2: T2?, p3: T3?, block: (T1, T2, T3)->R?): R? {
return if (p1 != null && p2 != null && p3 != null) block(p1, p2, p3) else null
}
inline fun <T1: Any, T2: Any, T3: Any, T4: Any, R: Any> safeLet(p1: T1?, p2: T2?, p3: T3?, p4: T4?, block: (T1, T2, T3, T4)->R?): R? {
return if (p1 != null && p2 != null && p3 != null && p4 != null) block(p1, p2, p3, p4) else null
}
inline fun <T1: Any, T2: Any, T3: Any, T4: Any, T5: Any, R: Any> safeLet(p1: T1?, p2: T2?, p3: T3?, p4: T4?, p5: T5?, block: (T1, T2, T3, T4, T5)->R?): R? {
return if (p1 != null && p2 != null && p3 != null && p4 != null && p5 != null) block(p1, p2, p3, p4, p5) else null
}
// ...keep going up to the parameter count you care about
उदाहरण उपयोग:
val risk = safeLet(person.name, person.age) { name, age ->
// do something
}
जब सूची में कोई अशक्त आइटम न हो तो कोड का निष्पादन ब्लॉक करें
दो जायके यहाँ, पहले कोड के ब्लॉक को निष्पादित करने के लिए जब एक सूची में सभी गैर अशक्त आइटम होते हैं, और दूसरा ऐसा करने के लिए जब सूची में कम से कम एक शून्य आइटम नहीं होता है। दोनों मामले कोड के ब्लॉक में गैर-शून्य वस्तुओं की एक सूची देते हैं:
कार्य:
fun <T: Any, R: Any> Collection<T?>.whenAllNotNull(block: (List<T>)->R) {
if (this.all { it != null }) {
block(this.filterNotNull()) // or do unsafe cast to non null collectino
}
}
fun <T: Any, R: Any> Collection<T?>.whenAnyNotNull(block: (List<T>)->R) {
if (this.any { it != null }) {
block(this.filterNotNull())
}
}
उदाहरण उपयोग:
listOf("something", "else", "matters").whenAllNotNull {
println(it.joinToString(" "))
} // output "something else matters"
listOf("something", null, "matters").whenAllNotNull {
println(it.joinToString(" "))
} // no output
listOf("something", null, "matters").whenAnyNotNull {
println(it.joinToString(" "))
} // output "something matters"
फ़ंक्शन के लिए एक मामूली परिवर्तन वस्तुओं की सूची प्राप्त करता है और एक ही संचालन करता है:
fun <T: Any, R: Any> whenAllNotNull(vararg options: T?, block: (List<T>)->R) {
if (options.all { it != null }) {
block(options.filterNotNull()) // or do unsafe cast to non null collection
}
}
fun <T: Any, R: Any> whenAnyNotNull(vararg options: T?, block: (List<T>)->R) {
if (options.any { it != null }) {
block(options.filterNotNull())
}
}
उदाहरण उपयोग:
whenAllNotNull("something", "else", "matters") {
println(it.joinToString(" "))
} // output "something else matters"
इन विविधताओं को बदले मूल्यों जैसे बदला जा सकता है let()।
पहले गैर-शून्य आइटम (Coalesce) का उपयोग करें
SQL Coalesce फ़ंक्शन के समान, पहला नॉन नल आइटम लौटाएं। समारोह के दो स्वाद:
fun <T: Any> coalesce(vararg options: T?): T? = options.firstOrNull { it != null }
fun <T: Any> Collection<T?>.coalesce(): T? = this.firstOrNull { it != null }
उदाहरण उपयोग:
coalesce(null, "something", null, "matters")?.let {
it.length
} // result is 9, length of "something"
listOf(null, "something", null, "matters").coalesce()?.let {
it.length
} // result is 9, length of "something"
अन्य बदलाव
... अन्य विविधताएं हैं, लेकिन अधिक विनिर्देशन के साथ इसे कम किया जा सकता है।