【发布时间】:2014-08-05 09:39:33
【问题描述】:
这里是 Java-Scala 代码:
class MyDbManager extends SQLiteOpenHelper ....
val cursor = new MyDbManager().getReadableDatabase.query(....)
val result = new ArrayList[MyItem] //???
//?????????
if (cursor.moveToFirst()) {
do {
result + parse(cursor)
} while (cursor.moveToNext())
}
//?????????
cursor.close()
result
我想要做的是不能使用任何可变集合和具有可变变量的不可变集合。我想做这样的事情:
val result = if (cursor.moveToFirst()) {
do { parse(cursor) } while (cursor.moveToNext())
}
您明白了:不使用任何冗余变量,尤其是可变变量。当然,上面的代码不会编译。
如果可能,我该怎么做?我希望不涉及任何第三方库,尽可能简单。
更新: 建议使用“for”。因为在我的例子中“for”转换为“map”和“filter”,我想知道为什么这不起作用:
if.(cursor.moveToFirst()) cursor.filter(_.moveToNext()).map { x => parse(x) }
【问题讨论】:
-
这会很困难:数据库游标本质上是一种命令式构造。如果你想避免命令式循环,你可以使用
fold传递光标。 -
或者,如果您希望使用
filter,您可以使用始终解析为true的谓词来获取查询的所有行。 -
尝试使用
scala.collection.Iteratortrait 定义一个扩展游标类的新类。然后,您只需要定义hasNext和next()方法,就可以使用 for-comp
标签: java scala functional-programming