2017-05-26 56 views
0

f()返回一個可爲空的值。null to listOf(),not null to listOf(value)in Kotlin in one liner?

我想要做的是,
如果f()爲空,得到一個空列表,
否則,如果f()不爲空,獲得單項value的列表。

在Scala中,我們可以做這樣的事情:

Option(f()).toList 

以上冗長

Option(f()).map(v => List(v)).getOrElse(List.empty) 

在科特林,沒有Option(假設沒有Funktionale庫),以及空沒有toList()不像(None: Option)在斯卡拉。

我們有埃爾維斯操作,但空將是listOf()功能裏面,所以這將是

listOf(f() ?: /* What can I do here? */) 

我們要爲空是什麼listOf(/*no argument */),但貓王運營商需要一個參數,所以listOf(f() ?:)將導致在編譯錯誤。

至少我們可以做

val v = f() 
if (v == null) listOf() else listOf(v) 

,但它是一個兩個襯墊。

這是否有一些表達?

在哪裏,我會用這句話是在類的主構造默認參數,因此,如果它不是一個襯墊,它會用括號括起來,所以是這樣的:

class A(
    val p1: List<V> = run { 
     val v = f() 
     if (v == null) listOf() else listOf(v) 
    }, 
    val p2: ... = ..., 
    ...) 

這看起來相當醜,不是嗎?

回答

4

編輯

由於@Naetmul指出,listOfNotNull(f())在語法上是不如我原來貼在下面,同時還採用可變數量的參數,例如

val myList = listOfNotNull(f(), g(), h()) 

會返回一個列表所有非空的結果。


我會在這裏使用 let

val myList = f()?.let { listOf(it) } ?: emptyList() 

上的f()返回值使用?. safe call,然後用let運行的代碼塊。如果f()爲null,則不會運行此代碼塊,從而生成空值。然後我們使用?: elvis operator回退到空列表。

這被分解成幾行,以更好地理解

val myValue = f() 
val myList: List<Any> 
if (myValue != null) { 
    myList = listOf(myValue) 
} else { 
    myList = emptyList() 
} 

1

對於這個具體問題,我可以做

listOfNotNull(f())