我正在尝试使以下代码起作用,但是出了点问题,下面是一个片段:
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();
答案 0 :(得分:2)
您的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
对象,如下所示直接调用它,而无需方法引用< / p>
Flowable.fromIterable(cache)
.zipWith(doesExist(anotherCache), (record, exist) -> {
// do stuff
return true;
}).subscribe();
注意:有关更多信息,请参见method reference
更新:如果您试图将fromIterable
发出的项目传递给doesExist
方法,并获得组合结果boolean
和cacheRecord
,然后
创建如下的holder类
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;
});
}