Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/309.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
RxJava:如何.zip两个可观察的,然后。合并它们并最终。减少以聚合所有结果_Java_Rx Java - Fatal编程技术网

RxJava:如何.zip两个可观察的,然后。合并它们并最终。减少以聚合所有结果

RxJava:如何.zip两个可观察的,然后。合并它们并最终。减少以聚合所有结果,java,rx-java,Java,Rx Java,我有以下代码: public void foo() { Long[] gData = new Long[] { 1L, 2L }; rx.Observable.from(gData) .concatMap(data -> { rx.Observable<GmObject> depositObs1 = depositToUserBalance(data, 1); rx.Observable<GmObject>

我有以下代码:

public void foo() {
    Long[] gData = new Long[] { 1L, 2L };

    rx.Observable.from(gData)
    .concatMap(data -> {

        rx.Observable<GmObject> depositObs1 = depositToUserBalance(data, 1);
        rx.Observable<GmObject> depositObs2 = depositToUserBalance(data, 2);


        return rx.Observable.zip(depositObs1, depositObs2, (depositObj1, depositObj2) -> {

            depositObj1.putNumber("seat_index", data);
            depositObj2.putNumber("seat_index", data);

            return rx.Observable.merge(
                    rx.Observable.just(depositObj1),
                    rx.Observable.just(depositObj2));
        })
    })
    .reduce(new ArrayList<Long>(), (payoutArr, payoutObj) -> {

        int seatIndex = ((GmObject) payoutObj).getNumber("seat_index").intValue();
        long payout = ((GmObject) payoutObj).getNumber("payout").longValue();
        payoutArr.add(seatIndex, payout);
        return payoutArr;
    })
    .subscribe(results -> {
        System.out.println(results);
    });
}
public void foo(){
Long[]gData=新的Long[]{1L,2L};
从(gData)可观察到的rx
.concatMap(数据->{
rx.可观察存款OBS1=存款人平衡(数据,1);
rx.可观察存款OBS2=存款人平衡(数据,2);
返回rx.Observable.zip(存款OBS1,存款OBS2,(存款OBJ1,存款OBJ2)->{
存款对象J1.putNumber(“座位索引”,数据);
存放对象J2.putNumber(“座位索引”,数据);
返回rx.Observable.merge(
rx.可观察到的刚度(J1),
rx.可观察的.just(depositObj2));
})
})
.reduce(新的ArrayList(),(payotarr,payoutObj)->{
int seatIndex=((GmObject)payoutObj).getNumber(“seat_index”).intValue();
long payout=((GmObject)payoutObj.getNumber(“payout”).longValue();
payotarr.add(seatIndex,payout);
回报率;
})
.订阅(结果->{
系统输出打印项次(结果);
});
}
这段代码使用.zip向可观察对象发送,然后添加一个“seat_index”属性并调用.merge以使用.reduce,这样最终所有结果都将聚合到一个ArrayList中

这段代码有一个问题:当.reduce处理其输入时,它将其作为可观察对象而不是作为GmObject…什么函数可以从其可观察包装中“提取”GmObject

这样使用rxJava有意义吗?还是有更好的技术


谢谢

操作符将lambda作为第三个参数。这个lambda是一个2 args函数,它返回一个由args组合而成的对象。而不是合成结果的
可观察的
(但是,当然,对象可以是
可观察的
,但它不是你想要的)

因此,在您的
zip
调用之后,您将有一个
可观察的
,但您希望看到一个
可观察的

我认为
zip
接线员不是您要找的接线员

public void foo() {
    Long[] gData = new Long[] { 1L, 2L };

    rx.Observable.from(gData)
    .concatMap(data -> {

        rx.Observable<GmObject> depositObs1 = depositToUserBalance(data, 1).doOnNext(obj -> obj.putNumber("seat_index", data));
        rx.Observable<GmObject> depositObs2 = depositToUserBalance(data, 2).doOnNext(obj -> obj.putNumber("seat_index", data));


        return rx.Observable.merge(depositObs1, depositObs2);
    })
   .reduce(new ArrayList<Long>(), (payoutArr, payoutObj) -> {

        int seatIndex = ((GmObject) payoutObj).getNumber("seat_index").intValue();
        long payout = ((GmObject) payoutObj).getNumber("payout").longValue();
        payoutArr.add(seatIndex, payout);
        return payoutArr;
   })
   .subscribe(results -> System.out.println(results));
}
public void foo(){
Long[]gData=新的Long[]{1L,2L};
从(gData)可观察到的rx
.concatMap(数据->{
rx.Observable DepositorB1=存款人平衡(数据,1).doOnNext(obj->obj.putNumber(“座位指数”,数据));
rx.Observable存款obs2=存款人平衡(数据,2).doOnNext(obj->obj.putNumber(“座位指数”,数据));
返回rx.Observable.merge(存款OBS1、存款OBS2);
})
.reduce(新的ArrayList(),(payotarr,payoutObj)->{
int seatIndex=((GmObject)payoutObj).getNumber(“seat_index”).intValue();
long payout=((GmObject)payoutObj.getNumber(“payout”).longValue();
payotarr.add(seatIndex,payout);
回报率;
})
.subscribe(results->System.out.println(results));
}

如此简单,但我自己却无法理解……我从未在Android上使用过doOnNext()…@dwursteisen任何方法来实现这一点(没有lambda)?用匿名类替换lambda。(尝试一个Java8项目,并要求您的IDE将其转换为一个匿名类,以查看我遇到了什么)