2017-05-26 1 views
1

Dans Kotlin, l'instruction finale d'une fonction peut être interprétée comme sa valeur de retour.Pour une fonction Kotlin utilisée comme expression, existe-t-il une manière concise d'opérer et de renvoyer une valeur?

Une situation comme l'exemple suivant peut-elle être simplifiée pour être moins verbeuse?

{ text: String -> 
    val validated = validateText(text) 
    if (validated) { 
    actOnValidation() 
    } 
    validated 
} 

Un cas concret où je voudrais faire est ci-dessous dans un exemple en utilisant RxJava - même s'il y a une meilleure approche Rx Je suis aussi intéressé par une solution pure Kotlin si elle existe.

fun inputChainObservable(targetField: TextView, chainedField: TextView): Observable<Boolean> { 
    return targetField.textChanges() 
     .observeOn(AndroidSchedulers.mainThread()) 
     .map { cs: CharSequence? -> 
     val hasInput = validateText(cs.toString()) 
     if (hasInput) { 
      chainedField.requestFocus() 
     } 
     hasInput 
     } 
} 

Répondre

5

Vous pouvez utiliser also() pour fonctionner sur et retourner le récepteur:

{ text: String -> 
    validateText(text).also { valid -> 
     if (valid) actOnValidation() 
    } 
} 

Vous pouvez également écrire comme ça, mais je préfère la première forme parce que je pense qu'il est plus clair:

{ text: String -> 
    validateText(text).also { 
     if (it) actOnValidation() 
    } 
}