2017-06-01 50 views
3

我不完全確定這是可能的,我絕對不知道要搜索什麼或如何簡潔地解釋它,但這似乎是一個相當kotlin-y的事情,我不會'如果可能的話,不要感到驚訝。從結果集生成列表

我想用listOf()實例化一個列表,但不是爲列表提供元素,而是提供一些代碼來爲列表生成元素。

例如,使用一個結果:(這不是有效的代碼)

val list: List<Int> = listOf(
    while(resultSet.next()){ 
     return resultSet.getInt(1) 
    } 
) 

是這樣的可能嗎?

+1

如果你想爲映射'ResultSet'到一個通用的解決方案'Iterable'或'List',有很多方法可以定義擴展函數。否則,由於'ResultSet'沒有擴展這些在Kotlin中易於使用的接口,如果你只需要這樣做一次,那麼只需遍歷該集合並將每個元素添加到可變列表中的簡單解決方案可能就是最好的。 – zsmb13

+0

@ zsmb13是的,我添加了一個擴展函數並按照你在這種情況下的建議實現它,但是我的問題更多的是出於這個特定用例提示的好奇心,而不是特別關於ResultSets –

回答

6

ResultSet不具備進行此類轉換的最佳界面。但它看起來是這樣的:

val list = resultSet.use { 
    generateSequence { 
     if (resultSet.next()) resultSet.getInt(1) else null 
    }.toList() // must be inside the use() block 
} 

// resultSet is already closed automatically at this point 

參見:generateSequence()


如果你想離開它作爲一個Sequence代替List懶洋洋地處理它,你不能使用.use()自動關閉助手。

val seq = generateSequence { 
    if (resultSet.next()) resultSet.getInt(1) else null 
} 

// later remember to call resultSet.close(), since the resultSet is still open 

隨着科特林1.1實驗coroutines您可以:

val seq = buildSequence { 
    while (resultSet.next()) { 
     yield(resultSet.getInt(1)) 
    } 

    // resultSet.close() might work ok here 
} 

// if not, later remember to resultSet.close() 

參見:buildSequence()

1

它只是發生在我,你可以使用generateSequence了。道具傑森爲得到它更快^^

這是我想出了(未測試,但相當短):

val list = generateSequence { 
    if(!resultSet.next()) null 
    else resultSet.getInt(1) 
}.toList()