2016-05-16 1 views
3

Давайте представим, у вас есть 2 fonctions возвращения обнуляемым и вы не можете составить эти 2 функции:Как составить nullables в Котлин

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

Для достижения композиции, я написал эту функции:

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

val four = all(1) 

Можно ли составить 2 значения с нулевым значением, чтобы получить еще одну допустимую величину без явной записи if (y != null) и return null?

В Scala, я бы просто сделать что-то вроде:

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) 

Должен ли я использовать Java факультативный для достижения этой цели, или это возможно с ? оператора?

Спасибо :)

+1

Это сильно охватываемой: http://stackoverflow.com/questions/34498562/in-kotlin-what-is-the-idiomatic-way-to-deal-with-nullable-values-referencing-o –

ответ

2

В случае, если вы хотите, чтобы в буквальном смысле составляют две функции (в том смысле, FP), то лучше использовать ссылки функции для удобства чтения:

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

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

Можно с safe call ?. оператора и let функции комбо, как это:

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

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

Для более идиомы, как это, используйте this link.

+0

Отличный ответ спасибо! – Loic

+0

Создание методов расширения методов упростит процесс чрезвычайно. –

Смежные вопросы