Проблема с .zip для повторяемости (rxJava) - PullRequest
0 голосов
/ 30 сентября 2018

У меня есть код с четырьмя наблюдаемыми.Я применяю Observable.zip к ним:

Observable<Currencies> usd = CoinMarket.getMarketApi().getCurrencies();
    Observable<Currencies> rub = CoinMarket.getMarketApi().getCurrencies("RUB");
    Observable<Currencies> eur = CoinMarket.getMarketApi().getCurrencies("EUR");
    Observable<Currencies> btc = CoinMarket.getMarketApi().getCurrencies("BTC");

    List<Observable<Currencies>> singles = new ArrayList<>();
    singles.add(usd);
    singles.add(rub);
    singles.add(eur);
    singles.add(btc);

    Observable<Currencies> c = Observable.zip(singles, new Function<Currencies[], Currencies>() {
                @Override
                public Currencies apply(@NotNull Currencies[] objects) throws Exception {
                    return ramming(objects);
                }
            });

Но я получил ошибку:

enter image description here

В сообщении говорится, что методс такой подписью не был найден (возможно я не прав), но я иду в декларацию и вижу, что подпись, вроде как, подходит.

 public static <T, R> Observable<R> zip
 (Iterable<? extends ObservableSource<? extends T>> sources,
 Function<? super Object[], ? extends R> zipper)

Что я делаю не так?

PS: я думаю, что эта ошибка RxJava2Iterableisbroken

Ответы [ 2 ]

0 голосов
/ 30 сентября 2018

Это не ошибка.Вам нужно Function<? super Object[] из-за общего ограничения Java.Это также объясняется в Javadocs zips .

Observable<Currencies> usd = CoinMarket.getMarketApi().getCurrencies();
Observable<Currencies> rub = CoinMarket.getMarketApi().getCurrencies("RUB");
Observable<Currencies> eur = CoinMarket.getMarketApi().getCurrencies("EUR");
Observable<Currencies> btc = CoinMarket.getMarketApi().getCurrencies("BTC");

List<Observable<Currencies>> singles = new ArrayList<>();
singles.add(usd);
singles.add(rub);
singles.add(eur);
singles.add(btc);

Observable<Currencies> c = Observable.zip(singles, new Function<Object[], Currencies>() {
            @Override
            public Currencies apply(@NotNull Object[] objects) throws Exception {
                Currencies[] currencies = new Currencies[objects.length];
                for (int i = 0; i < objects.length; i++) {
                     currencies[i] = (Currencies)objects[i];
                }
                return ramming(currencies);
            }
        });
0 голосов
/ 30 сентября 2018

Flowable и Single - это две разные сущности в RxJava.Flowable реализует Publisher, где как Single реализует SingleSource.Когда вы пытаетесь использовать zip-оператор, он ожидает массив списка объектов, который реализует Publisher, и, следовательно, ошибку.

...