RxJava2:将Flowable与zipWith一起使用

时间:2018-11-29 22:04:43

标签: rx-java2

我正在尝试使以下代码起作用,但是出了点问题,下面是一个片段:

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 :(得分: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方法,并获得组合结果booleancacheRecord,然后

创建如下的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;
            });
  }