2017-06-01 6 views
3

私はこれが可能であるとは確信していません。何を検索するのか、それを簡潔に説明する方法は間違いありませんが、これはかなりコトリン-yのようです。それが可能であれば驚くことはありません。結果セットからリストを作成する

listOf()でリストをインスタンス化したいが、リストの要素を提供する代わりに、リストの要素を生成するコードを提供する。

たとえば、ResultSetを使用した:(これは有効なコードではありません)

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

は、この可能性のようなものですか?

+1

あなたはに 'ResultSet'をマッピングするための一般的な解決策が必要な場合'Iterable'や' List'のように、拡張機能を定義する方法はいくつかあります。さもなければ、 'ResultSet'はKotlinで扱いやすいこれらのインターフェースを拡張しないので、これを一度だけ行う必要があれば、セットを反復し、すべての要素を変更可能なリストに追加するという簡単な解決策はおそらく一番いい。 – zsmb13

+0

@ zsmb13ええ、私は拡張機能を追加し、このケースで提案したように実装しましたが、私の質問は、この具体的なユースケースによって促された好奇心から、ResultSet –

答えて

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()


をあなたの代わりにListSequenceが遅延し、それを処理するためにそのままにしたい場合は、あなたが使用することはできませんが、それは次のようになります.use()自動閉鎖ヘルパー。 Kotlin 1.1することができます実験coroutines

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

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

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() 
関連する問題