2016-05-16 2 views
3

Imaginons que vous avez 2 fonctions retour annulable et vous ne pouvez pas composer cette 2 fonctions:Comment composer nullables dans Kotlin

fun giveInt(x: Int):Int? = x+1 
fun giveInt2(x: Int):Int? = x+2 

Pour obtenir la composition, je l'ai écrit cette fonction:

fun all(x:Int):Int? { 
    val y = giveInt(x) 
    if (y != null) return giveInt2(y) else return null; 
} 

val four = all(1) 

Est-il possible de composer 2 valeurs nullables pour obtenir un autre nullable sans écrire explicitement if (y != null) et return null?

Dans Scala je voudrais juste faire quelque chose comme:

def giveInt(x: Int):Option[Int] = Some(x+1) 
def giveInt2(x: Int):Option[Int] = Some(x+2) 
def all(x:Int): Option[Int] = giveInt(x).flatMap(giveInt2) 

Dois-je utiliser java en option pour atteindre cet objectif ou est-il possible avec l'opérateur ??

Merci :)

+1

Ceci est fortement couvert par: http://stackoverflow.com/questions/34498562/in-kotlin-quoi-est-la-idiomatique-façon-de-négocier-avec nullable-values-référencement-o –

Répondre

2

Si vous voulez composer littéralement deux fonctions (dans le sens FP), alors il est préférable d'utiliser des références de fonction pour une meilleure lisibilité:

fun giveInt(x: Int):Int? = x+1 
fun giveInt2(x: Int):Int? = x+2 

fun all(x: Int): Int? = giveInt(x)?.let(::giveInt2) 
6

Il est possible avec safe call ?. opérateur et let combo fonction comme ceci:

fun giveInt(x: Int):Int? = x+1 
fun giveInt2(x: Int):Int? = x+2 

fun all(x: Int): Int? = giveInt(x)?.let { giveInt2(it) } 

Pour plus d'idiomes comme celui-ci, utilisez this link.

+0

Grande réponse merci! – Loic

+0

Rendre vos méthodes d'extension des méthodes simplifierait énormément le processus. –