从结果集中产生列表



我不完全确定这是可能的,我绝对不知道该搜索什么或如何简洁地解释它,但这似乎是我的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实验性珊瑚酸,您可以:

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

,因为原来的问题是关于列表的,而不是序列(在其他答案中涵盖(,最好的解决方案是使用kotlin v1.6中引入的列表构建器。

val list = buildList{
    if(resultSet.next()) add(resultSet.getInt(1))
}

显然,getInt需要用实际感兴趣的属性替换。

相关内容

  • 没有找到相关文章

最新更新