从 ResultSet 生成列表

Producing a List from a ResultSet

我不完全确定这是可能的,而且我绝对不知道要搜索什么或如何简洁地解释它,但这似乎是一个 kotlin-y 的东西,如果有可能。

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

例如,使用结果集:(这不是有效代码)

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

这样的事情可能吗?

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

我突然想到您也可以使用 generateSequence。支持 Jayson 更快地完成它 ^^

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

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

从 kotlin 1.3 开始

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

通过分解出值“提取”,可以使序列方法更通用一些:

fun <T> ResultSet.asSequence( extract: () -> T ) : Sequence<T> = generateSequence {
        if (this.next()) extract() else null
    }

然后像这样使用它:

resultSet.asSequence { resultSet.getString(1) }