2015-10-30 15 views
11

A volte io non uso tutti i parametri lambda, come il secondo parametro nell'esempio qui sotto, che è un vecchio valore in un evento di modifica:Come omettere i parametri lambda in Kotlin?

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

Come li tralascio? Perché ingombra il codice e fa male la leggibilità. Precedentemente ho usato il metodo sopra, ma in kotlin 1.0.0-beta-1103 i caratteri di sottolineatura sono riservati.

+5

Attualmente non – Yaroslav

+4

possibile se si utilizza il lambda spesso abbastanza per garantire ciò, è sempre possibile aggiungere una funzione di estensione che fa la stessa cosa con i parametri che non si desidera rimuovere. – eski

risposta

5

A partire dal 1.1, è possibile fare esattamente questo:

sottolineatura per le variabili non utilizzate (dal 1,1)

Se il parametro lambda è inutilizzato, è possibile inserire un trattino basso invece del proprio nome:

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

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

Vorrei aggiungere che il compilatore genera ora un avvertimento per i parametri lambda non utilizzati, e c'è una nuova soluzione rapida corrispondente per Android Studio

4

È possibile utilizzare escaping for Java identifiers that are keywords in Kotlin (ad esempio backtick) o sovraccaricare onChange.

backtick

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

sovraccarico onChange

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

E se non è possibile modificare Listener<T1, T2> (o qualsiasi tipo settable è dal vostro esempio), allora si può utilizzare un extension function:

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

È quindi possibile chiamare onChange come si vuole:

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