RxJava组排序数据

RxJava组排序数据,java,rx-java,reactive-programming,Java,Rx Java,Reactive Programming,我有一个非常大的数据集合,原始数据已经按照关键点进行了排序。例如,我有一个CSV文件,第一列将是分组的键 A,x,x,x A,x,y,x A,z,y,y C,x,s,d C,t,d,s B,a,s,a E,x,x,x E,t,r,y 这些行被转换为对象并放入列表中,并使用RxJavaFlowable进行流式传输。因为这个CSV将是巨大的(如此巨大以至于应用程序崩溃),有没有一种好方法可以将这些对象转换为地图条目,如下所示: { 'A': [[x,x,x],[x,y,x],[z,y,y]] }

我有一个非常大的数据集合,原始数据已经按照关键点进行了排序。例如,我有一个CSV文件,第一列将是分组的键

A,x,x,x
A,x,y,x
A,z,y,y
C,x,s,d
C,t,d,s
B,a,s,a
E,x,x,x
E,t,r,y
这些行被转换为对象并放入列表中,并使用RxJava
Flowable
进行流式传输。因为这个CSV将是巨大的(如此巨大以至于应用程序崩溃),有没有一种好方法可以将这些对象转换为地图条目,如下所示:

{ 'A': [[x,x,x],[x,y,x],[z,y,y]] }

从中使用
collectWhile
,并指定采集工厂以生成特殊的键控对象:


类键控{
最终K键;
最后名单;
...
}
K键(值){
...
}
source.compose(
变形金刚。
收集时间(
//工厂
()->新键控(),
//加
(键控,x)->{
键入。列表。添加(x);
返回键;},
//状况
(键控,x)->
keyed.list.isEmpty()||
键(x).equals(keyed.key));

我现在使用的是
流动变压器。部分收集。
例如

Flowable.fromPublisher(FlowableTransformers.partialCollect(
        (Consumer<PartialCollectEmitter<LineData, Integer, 
        ListBuilder, ListDataModel>>) emitter -> {
            // Get or initialize collecting object
            ListBuilder lb = emitter.getAccumulator();
            if (lb == null) {
                lb = new ListBuilder();
                emitter.setAccumulator(lb);
            }

            if (emitter.demand() != 0) {
                boolean d = emitter.isComplete();
                if (emitter.size() != 0 && !d) {
                    LineData data = emitter.getItem(0);
                    emitter.dropItems(1);

                    // add returns the finished model if the prefix changes
                    ListDataModel model = lb.add(data);

                    if (model != null) {
                        emitter.next(model);
                    }
                } else if (d) {
                    if (!lb.isEmpty()) {
                        // clear returns the last model
                        emitter.next(lb.clear());
                    }
                    emitter.complete();
                    return;
                }
            }
            emitter.setIndex(0);
        }, Functions.emptyConsumer(), settings.getReadBufferSize() + 1).apply(
                Flowable.fromIterable(file.getFileNameList())
                        .concatMap(
                                fileName -> reader
                                        .getLineData(fileName)
                                        .buffer(settings.getReadBufferSize()))
                        .flatMap(Flowable::fromIterable)))
Flowable.fromPublisher(FlowableTransformers.partialCollect(
(消费者)发射器->{
//获取或初始化收集对象
ListBuilder lb=emitter.getAccumulator();
如果(lb==null){
lb=新的ListBuilder();
发射器.蓄电池(磅);
}
如果(发射器.需求()!=0){
布尔d=发射器.isComplete();
if(emitter.size()!=0&&!d){
LineData数据=发射器.getItem(0);
1.项目(1);
//如果前缀更改,“添加”将返回完成的模型
ListDataModel model=lb.add(数据);
如果(型号!=null){
下一步(模型);
}
}若否(d){
如果(!lb.isEmpty()){
//清除返回最后一个模型
emitter.next(lb.clear());
}
emitter.complete();
返回;
}
}
发射器。设置索引(0);
},Functions.emptyConsumer(),settings.getReadBufferSize()+1)。应用(
Flowable.fromIterable(file.getFileNameList())
.concatMap(
文件名->读卡器
.getLineData(文件名)
.buffer(settings.getReadBufferSize()))
.flatMap(Flowable::fromIterable)))