Ваш метод 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;
});
}