flatMap运算符导致编译错误

时间:2018-11-02 16:37:56

标签: rx-java observable rx-java2 flatmap

如下所示,我正在创建Observables。当我尝试应用faltMap运算符时,我收到编译错误:

Cannot infer type argument(s) for <R> flatMap(Function<? super T,? extends ObservableSource<? extends R>>)
Type mismatch: cannot convert from String to ObservableSource<? extends Object>

我知道map和flatMap之间的区别吗?我想知道为什么当我使用flatMap运算符时收到编译错误。

代码

public static void main(String[] args) {
    Observable<List<Person>> observables = Observable.create(e-> {
        for(List<Person> p : Main.getPersons()) {
            e.onNext(p);
        }
        e.onComplete();
    });
    observables
    //.subscribeOn(Schedulers.newThread())//newThread
    .flatMap(p->p.get(0).getName())
    .map(p->p)
    .doOnNext(p-> System.out.println("p.." + p))
    //.delay(5, TimeUnit.SECONDS)
    //.interval(0, 5, TimeUnit.SECONDS)
    .observeOn(Schedulers.io())
    .subscribe(new Observer() {
        @Override
        public void onComplete() {
            // TODO Auto-generated method stub
            System.out.println("onCompleted");
        }

        @Override
        public void onError(Throwable arg0) {
            // TODO Auto-generated method stub

        }

        @Override
        public void onNext(Object arg0) {
            // TODO Auto-generated method stub
            System.out.println("onNextFromObserver: " + arg0);
        }

        @Override
        public void onSubscribe(Disposable arg0) {
            // TODO Auto-generated method stub
        }
    }); 
}

private static List<List<Person>> getPersons() {
    return Arrays.asList(
            Arrays.asList(new Person("Sanna", 59, "EGY")),
            Arrays.asList(new Person("Mohamed", 69, "EGY")),
            Arrays.asList(new Person("Ahmed", 44, "QTR")),
                    Arrays.asList(new Person("Fatma", 29, "KSA")),
                    Arrays.asList(new Person("Lobna", 24, "EGY"))
                    );
}
}

1 个答案:

答案 0 :(得分:1)

这里的问题是p.get(0).getName()应该返回一个可观察值。 .map(p->p)行也没有用。当您使用平面地图时,您将拥有“可观察”的对象,而在下一个流中,您将拥有“类型1”。似乎您可以在这里使用map而不是flatMap。在该地图之后,您还具有String,因此在map函数下面的一行中,您必须使用String对象而不是Person对象。

您能解释一下您想要什么,以便我修改您的代码吗?

P.S:因此,考虑到Class1到Class2的映射将在下游发出class2,但Class1到Observable的flatMap将发出class3。因此,如果您可以观察到,则需要平面地图,否则请使用地图