从 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) }
我不完全确定这是可能的,而且我绝对不知道要搜索什么或如何简洁地解释它,但这似乎是一个 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) }