RxJava2: Использование Flowable с zipWith - PullRequest
0 голосов
/ 30 ноября 2018

Я пытаюсь заставить работать следующий код, но что-то не так, вот фрагмент:

private void myMethod() {
Flowable.fromIterable(cache)
.zipWith(this::doesExist, (record, exist) -> {
    // do stuff
    return true;
}).subscrib();
}

private Flowable<Boolean> doesExist(CacheRecord record) {
    // Do something
    return Flowable.just(true);
}

Это не компилируется, любая идея?

ОБНОВЛЕНИЕ : Есть мысли по поводу следующего фрагмента:

Flowable.fromIterable(m_cache) // 
.flatMapCompletable(cachedStation -> { 
    return Single.zip(Single.just(cachedStation), doesIssueExist(cachedStation), (record, exist) -> { 
    System.out.println(cachedStation + ", " + exist); 
    return true; 
}).toCompletable(); 
}).subscribe();

1 Ответ

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

Ваш метод doesExist требует CacheRecord в качестве параметра.Но указанная вами ссылка на метод this::doesExist отправляет экземпляр Subscriber<? super Object>, поэтому отображается ошибка несовместимого типа.

Ниже приведена расширенная форма вашего метода.

  private void myMethod() {
    Flowable.fromIterable(cache)
            .zipWith(new Publisher<Object>() {
                @Override
                public void subscribe(Subscriber<? super Object> s) {
                    doesExist(s);
                }
            }, (record, exist) -> {
                // do stuff
                return true;
            }).subscribe();
 }

Здесь первый параметр zipWith

  new Publisher<Object>() {
        @Override
         public void subscribe(Subscriber<? super Object> s) {
                doesExist(s);
            }
   }

- это то, что вы сократили до this::doesExist

Как видите, для zipWith требуется первый параметр Publisher, и вы создали анонимного издателя, а в методе subscribe вы вызываете doesExist(s), отправив Subscriber<? super Object> s, который не является обязательным типом.Ваша справочная инструкция по методу this::doesExist выполняет точно такую ​​же операцию, и поэтому ошибка incompatible type отображается компилятором.

Если вы пытаетесь zip Flowable с потоком, возвращаемым doesExistметод, вы можете вызвать его напрямую, без ссылки на метод, передав действительный CacheRecord объект следующим образом

Flowable.fromIterable(cache)
        .zipWith(doesExist(anotherCache), (record, exist) -> {
            // do stuff
            return true;
        }).subscribe();

Примечание. Для получения дополнительной информации см. справочник метода

Обновление : если вы пытаетесь передать элементы, испущенные методом fromIterable, в doesExist и получить комбинированный результат boolean и cacheRecord, тогда

создайте класс держателей следующим образом

class CacheRecordResult {
    CacheRecord cacheRecord;
    boolean isExist;

    public CacheRecordResult(CacheRecord cacheRecord, boolean isExist) {
        this.cacheRecord = cacheRecord;
        this.isExist = isExist;
    }
   }

Затем подпишитесь на CacheRecordResult следующим образом

  private void myMethod() {
    Flowable.fromIterable(cache)
          .flatMap(cacheRecord -> doesExist(cacheRecord)
                  .map(exist -> new CacheRecordResult(cacheRecord, exist)))
          .subscribe(cacheRecordResult -> {
                CacheRecord cacheRecord = cacheRecordResult.cacheRecord;
                boolean isExist = cacheRecordResult.isExist;
            });
  }
...