对连续项使用RXJava groupby

对连续项使用RXJava groupby,java,rx-java2,Java,Rx Java2,我有一个可观察到的解析大型csv文件(无法放入内存)并发出如下元素: [{id=1, childId=1}, {id=1, childId=2}, {id=1, childId=3}, {id=2, childId=5}, {id=2, childId=6}, {id=1, childId=23}, {id=1, childId=18}] 一行一项 使用groupBy时,我的输出类似于 [{id=1, childs=1,2,**323, 18**}, {id=2, childs=5,6}]

我有一个可观察到的解析大型csv文件(无法放入内存)并发出如下元素:

[{id=1, childId=1}, {id=1, childId=2}, {id=1, childId=3}, {id=2, childId=5}, {id=2, childId=6}, {id=1, childId=23}, {id=1, childId=18}]
一行一项

使用groupBy时,我的输出类似于

[{id=1, childs=1,2,**323, 18**}, {id=2, childs=5,6}]
这对groupBy来说似乎很正常。但我需要的是接收连续项目的分组元素,所以我希望在另一个元素中接收id=1的最后一个项目。总的来说,我想收到3个元素

所以我想连续地接收同一个键的一个可观测值,当我有一个不同的键时,我想接收另一个可观测值(分组)


提前感谢您

一个可能的解决方案是编写定制的
observetTransformer
。 在我看来,最简单的解决方案是根据下一条规则将项目分组:if cell.Id!=上一个单元格。我把它放在另一个组中

data class Cell(val id: Int, val childId: Int)

Observable.fromIterable(cells)
                .map(object: Function<Cell, Pair<Int, Cell>> {
                    var latest: Int? = null
                    var groupNumber: Int = 0

                    override fun apply(t: Cell): Pair<Int, Cell> {
                        if(t.id != latest) {
                            latest = t.id
                            groupNumber++
                        }
                        return Pair(groupNumber, t)
                    }

                })
                .groupBy { it.first }
输出将是[(1,[1,2,3]),(2,[5,6]),(3,[23,18])

该解决方案并不干净,但它可以根据需要工作

Observable.fromIterable(cells)
            .map(object: Function<Cell, Pair<Int, Cell>> {
                var latest: Int? = null
                var groupNumber: Int = 0

                override fun apply(t: Cell): Pair<Int, Cell> {
                    if(t.id != latest) {
                        latest = t.id
                        groupNumber++
                    }
                    return Pair(groupNumber, t)
                }

            })
            .groupBy { it.first }
            .flatMapSingle { group ->
                return@flatMapSingle group.reduce(Pair(group.key!!, mutableListOf())) { acc: Pair<Int, MutableList<Int>>, el: Pair<Int, Cell> ->
                    acc.second.add(el.second.childId)
                    return@reduce acc
                }
            }.toList()
            .subscribe({
                Log.d("TAG", it.toString())
            }, { e -> e.printStackTrace() })