从ResultSet生成列表

时间:2017-06-01 19:50:39

标签: jdbc kotlin

我不完全确定这是可能的,我绝对不知道要搜索什么或如何简明扼要地解释它,但这似乎是一个非常好的事情,如果是这样的话我不会感到惊讶可能的。

我想用listOf()实例化一个列表,但不是提供列表的元素,而是提供一些产生列表元素的代码。

例如,使用ResultSet :(这不是有效代码)

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

这样的事情可能吗?

3 个答案:

答案 0 :(得分:10)

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

使用Kotlin 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 :(得分:1)

我刚刚发现你也可以使用generateSequence。向Jayson推销更快的^^

这是我提出的(未经测试,但相当短):

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

答案 2 :(得分:0)

自kotlin 1.3起

sequence {
    while (rs.next()) {
        yield(rs.getString(1))
    }
}.toList(