Android上的Kotlin:将光标映射到列表

Mar*_*one 7 android functional-programming kotlin

在Kotlin中,迭代Android Cursor对象并将结果放入列表的最佳方法是什么?

我自动转换的Java:

val list = ArrayList<String>()
while (c.moveToNext()) {
    list.add(getStringFromCursor(c))
}
Run Code Online (Sandbox Code Playgroud)

有更惯用的方式吗?特别是,它可以在一个只读列表的单一分配中完成吗?例如...

val list = /*mystery*/.map(getStringFromCursor)
Run Code Online (Sandbox Code Playgroud)

......或其他一些安排,其中列表是完整的.

Mar*_*one 13

这就是我最终使用的kotlin.sequences.generateSequence...

val list = generateSequence { if (c.moveToNext()) c else null }
        .map { getStringFromCursor(it) }
        .toList()
Run Code Online (Sandbox Code Playgroud)

我的第一次尝试有点短:

val list = (1 .. c.count).map {
    c.moveToNext()
    getStringFromCursor(c)
}
Run Code Online (Sandbox Code Playgroud)

两个版本都依赖于游标最初位于第一个记录之前.如果不是这样的话,第二个会抛出,而第一个会返回一个较短的列表.

  • 嗯,那第一项呢?我认为这个会更好:`fun Cursor.asSequence():Sequence <Cursor> = generateSequence(seed = takeIf {it.moveToFirst()}){takeIf {it.moveToNext()}}` (5认同)