【问题标题】:flatMap operator causes compilation errorflatMap 运算符导致编译错误
【发布时间】:2019-04-06 22:26:52
【问题描述】:

如下所示,我正在创建 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>

我知道地图和平面地图的区别吗?我想知道为什么我在使用 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"))
                    );
}
}

【问题讨论】:

  • 您的问题我不清楚。您是否说您知道其中的区别,但您无法说出为什么您自己在那条线上选择了flatMap 而不是map
  • @akarnokd 请您帮助我了解为什么我的代码中没有使用 flatmap。这将帮助我更好地理解差异
  • 你明白String 不是ObservableSource 吗? flatMap 要求您返回 ObservableSource,但您通过 p.get(0).getName() 返回 String。在那里使用map

标签: rx-java observable rx-java2 flatmap


【解决方案1】:

这里的问题是 p.get(0).getName() 应该返回一个 observable。 .map(p-&gt;p) 行也没有用。当您使用平面地图时,您将拥有 Observable,而在下一个流中,您将拥有 Type1。看来你可以在这里使用地图而不是 flatMap。同样在该地图之后,您有 String 因此在地图函数下方您必须使用 String 对象而不是 Person 对象。

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

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

【讨论】:

  • 谢谢..我只是想举个例子来看看平面图和地图之间的区别以及我应该什么时候使用它们。到目前为止我所理解的是.. flatMap:采用流“Observables,可选”并返回流。而 Map 获取流并返回与 Streams 包装相同类型的数据
  • 在所有类型的地图中,您也可以更改类型。如果需要,您可以在上游设置人员,在下游设置字符串。
  • 请问上游和下游有什么区别
  • 我的意思是该行上方的流和该行下方的数据流:gist.github.com/staltz/868e7e9bc2a7b8c1f754
猜你喜欢
  • 2014-02-08
  • 2017-04-30
  • 2017-04-08
  • 2011-08-01
  • 2012-08-13
  • 1970-01-01
  • 1970-01-01
  • 2017-05-12
  • 1970-01-01
相关资源
最近更新 更多