Question Comment omettre les paramètres lambda dans Kotlin?


Parfois, je n'utilise pas tous les paramètres lambda, comme le deuxième paramètre de l'exemple ci-dessous, qui est une ancienne valeur dans un événement de modification:

selected.onChange { value, _ ->
    checkBox.isChecked = value
}

Comment puis-je les omettre? Cause qui encombre le code et nuit à la lisibilité. Auparavant, j'ai utilisé la méthode ci-dessus, mais dans kotlin 1.0.0-beta-1103, les traits de soulignement sont réservés.


11
2017-10-30 06:51


origine


Réponses:


À partir de 1.1, vous pouvez faire exactement cela:

Underscore pour les variables non utilisées (depuis 1.1)

Si le paramètre lambda est inutilisé, vous pouvez placer un trait de soulignement à la place   de son nom:

map.forEach { _, value -> println("$value!") }

https://kotlinlang.org/docs/reference/lambdas.html#underscore-for-unused-variables-since-11

Je devrais ajouter que le compilateur génère maintenant un avertissement pour les paramètres lambda non utilisés, et qu’il existe un nouveau correctif correspondant pour Android Studio.


6
2018-03-02 14:34



Vous pouvez utiliser échapper à des identificateurs Java qui sont des mots clés dans Kotlin (c.-à-d. backticks) ou surcharge onChange.

Pointes

selected.onChange { value, `_` ->
    checkBox.isChecked = value
}

Surcharge onChange

interface Listener<T1, T2> {
    fun onChange(f: (T1, T2) -> Unit) // original method
    fun onChange(f: (T1) -> Unit)     // new method
}

Et si vous ne pouvez pas changer Listener<T1, T2> (ou quel que soit le type settable est de votre exemple) alors vous pouvez utiliser un fonction d'extension:

fun <T1, T2> Listener<T1, T2>.onChange(f: (T1) -> Unit) = onChange { t1, t2 -> f(t1) }

Vous pouvez alors appeler onChange comme tu veux:

selected.onChange { value ->
    checkBox.isChecked = value
}

4
2017-12-03 17:38