如下所示,我正在创建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"))
);
}
}
答案 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。因此,如果您可以观察到,则需要平面地图,否则请使用地图