我试图使用新的
Scala 2.10隐式类机制将java.sql.ResultSet转换为scala.collection.immutable.Stream.在Scala 2.9中,我使用以下代码,它有效:
/** * Implicitly convert a ResultSet to a Stream[ResultSet]. The Stream can then be * traversed using the usual methods map,filter,etc. * * @param resultSet the Result to convert * @return a Stream wrapped around the ResultSet */ implicit def resultSet2Stream(resultSet: ResultSet): Stream[ResultSet] = { if (resultSet.next) Stream.cons(resultSet,resultSet2Stream(resultSet)) else { resultSet.close() Stream.empty } }
我可以这样使用它:
val resultSet = statement.executeQuery("SELECT * FROM foo") resultSet.map { row => /* ... */ }
我想出的隐式类看起来像这样:
/** * Implicitly convert a ResultSet to a Stream[ResultSet]. The Stream can then be * traversed using the usual map,etc. */ implicit class ResultSetStream(val row: ResultSet) extends AnyVal { def toStream: Stream[ResultSet] = { if (row.next) Stream.cons(row,row.toStream) else { row.close() Stream.empty } } }
但是,现在我必须在ResultSet上调用toStream,这种方式会破坏“隐含”部分:
val resultSet = statement.executeQuery("SELECT * FROM foo") resultSet.toStream.map { row => /* ... */ }
我究竟做错了什么?
我是否仍应使用隐式def并导入scala.language.implicitConversions来避免“功能”警告?
UPDATE
以下是将ResultSet转换为scala.collection.Iterator(仅Scala 2.10)的替代解决方案:
/* * Treat a java.sql.ResultSet as an Iterator,allowing operations like filter,* map,etc. * * Sample usage: * val resultSet = statement.executeQuery("...") * resultSet.map { * resultSet => * // ... * } */ implicit class ResultSetIterator(resultSet: ResultSet) extends Iterator[ResultSet] { def hasNext: Boolean = resultSet.next() def next() = resultSet }
解决方法
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。