代码
Author author = baseRealm.where(Author.class).equalTo("id", mId).findFirst();
public boolean checkGlobalSyncStatus(Author author, List<Books> mBooks) {
final boolean[] isJobSynchronized = {false};
Observable.fromIterable(mBooks)
.filter(Books::isChanged)
.doOnNext(book -> isJobSynchronized[0] = true)
.just(author)
.flatMapIterable(Author::getAllBooks)
.filter(MyBook::isChanged)
.doOnNext(mBook -> isJobSynchronized[0] = true)
.just(author)
.flatMapIterable(Author::getAllWriters)
.filter(Writers::isChanged)
.doOnNext(jobPage -> isJobSynchronized[0] = true)
.subscribe();
return isJobSynchronized[0];
}
问题
fromIterable(mBooks)
来自静态参考 Observable
但 <{strong> just(author)
来自 instance-reference 。
我只想在单个查询中完成此操作。我可以为每个人做出不同的观察并执行所需的操作,但这将是漫长的。
为什么吗
通过这样做,SonarQube
给了我不成功的检查并强制我删除 instance-reference 。
任何替代方案都将受到赞赏。
答案 0 :(得分:1)
当它真的是一个可观察的时候,你试图使用just()
作为运算符。您的意图似乎是使用传入的author
进行一系列查询,然后检查与作者关联的任何图书是否已更改&#34;。
此外,您尝试返回一个布尔值,该值可能在返回发生时未设置。如果需要值,可能需要阻塞并等待观察链完成。更有可能的是,如果任何书籍已经更改,您希望观察者链完成。
此外,将标志设置为true的一系列步骤归结为第一次将标志设置为true
。
使用just()
将原始作者重新绑定到观察者链中,而不是map()
。使用toBlocking()
运算符使流程同步。
Observable.fromIterable(mBooks)
.filter(Books::isChanged)
.toBlocking()
.subscribe( ignored -> isJobSynchronized[0] = true );
return isJobSynchronized[0];
由于(可能)异步查询不再需要计算值,因此删除RxJava:
return mBooks.stream()
.filter(Books::isChanged)
.anyMatch();
答案 1 :(得分:0)
这里没有理由使用RxJava,但运营商的正确组合如下:
Author author = baseRealm.where(Author.class).equalTo("id", mId).findFirst();
public boolean checkGlobalSyncStatus(Author author, List<Books> mBooks) {
return Single.concat(
Observable.fromIterable(mBooks)
.any(Books::isChanged)
, // ---------------------------------------------
Observable.fromIterable(author.getAllBooks)
.any(MyBook::isChanged)
, // ---------------------------------------------
Observable.fromIterable(author.getAllWriters)
.any(Writers::isChanged)
)
.any(bool -> bool)
.blockingGet();
}