我得到List[String]
,我需要分组。对于每个块,我需要运行一个返回List[String]
的查询(JDBC)。
我想要的是:
这就是我所做的:
从Stream
生成ResultSet
,给定List[String]
(这是块):
def resultOfChunk(chunk: List[String])(statement: Statement): Stream[String] = {
//..
val resultSet = statement.executeQuery(query)
new Iterator[String] {
def hasNext = resultSet.next()
def next() = resultSet.getString(1)
}.toStream
}
制作最终名单:
val initialList: List[String] = //..
val connection = //..
val statement = connection.createStatement
val streams = for {
chunk <- initialList.grouped(10)
stream = resultOfChunk(chunk)(statement)
} yield stream
val finalList = streams.flatten
statement.close()
connection.close()
(变量名称旨在证明这一概念)。
它似乎有用,但我有点紧张:
Iterator[Stream]
。这是
人们在做什么?Iterator[Stream]
(我可以假设他们没有得到评估
压扁?)。答案 0 :(得分:1)
我将逐一回复:
当然,为什么不呢。为了便于阅读,您可能需要考虑在for-comprehension中展平。
val finalList = for {
chunk <- initialList.grouped(10)
result <- resultOfChunk(chunk)(statement)
} yield result
参见上面的展平。是的,你可以假设它们不会被评估。
Iterator
无法重复使用(假设initialList.grouped(10)
为您提供迭代器)。但是你可以使用Stream
代替Iterator
然后,是的,你可以,但是:
根据我所看到的情况,我建议您使用以下内容:
val finalList = for {
chunk <- initialList.grouped(10).toStream
result <- resultOfChunk(chunk)(statement)
} yield result
这将为您提供根据需要进行评估的Stream[String]
(按顺序访问时)。完全评估后,您可以关闭数据库连接并仍然使用它。