对连续项使用RXJava groupby
我有一个可观察到的解析大型csv文件(无法放入内存)并发出如下元素:对连续项使用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}]
[{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() })