Оператор flatMap вызывает ошибку компиляции - PullRequest
0 голосов
/ 02 ноября 2018

Как показано ниже, я создаю 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? Я хотел бы знать, почему, когда я использовал оператор 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 голосов
/ 02 ноября 2018

проблема здесь p.get(0).getName() должна возвращать наблюдаемую. линия .map(p->p) также бесполезна. когда вы используете flatmap, у вас есть Observable и в следующем потоке у вас будет Type1. Кажется, вы можете использовать карту здесь вместо flatMap. также после этой карты у вас есть String, поэтому в строке ниже функции карты вы должны работать с объектом String, а не с объектом Person.

Можете ли вы объяснить, что именно вы хотите, чтобы я мог изменить ваш код?

P.S: так что рассмотрите карту Class1 к Class2, будет излучать class2 в нисходящем, но flatMap из Class1 в Observable будет излучать class3. так что если у вас есть наблюдаемая вам нужна плоская карта, в противном случае используйте карту

...