我有下载器,它通过套接字将下载的百分比发送到前端。它看起来像这样:
DownloadStream downloadStream = SomeService.downloadStream(someFile);
Long total = downloadStream.totalSize();
Subject totalDownloaded = new BehaviorSubject.createDefault(0);
Disposable downloadSubscriber = totalDownloaded.subscribe(downloaded -> {
Message message = new Message(downloaded, total);
send(message);
});
Long downloaded = downloadStream.stream(); //stream() is bulk read/write.
while(downloaded != -1L) {
chunk = downloadStream.stream();
totalDownloaded.onNext(totalDownloaded.value + chunk);
}
但问题是 defaultValue=0 调用订阅的 lambda。如何在没有副作用的情况下定义默认值?或者有一些可观察长的增量解决方案?请帮忙...
您可以使用 flatMap(( 和 filter(( 函数删除值。
例:
// create sequence
Observable<Integer> o = Observable.just(0, 10, 25, 32, 56, 74, 100);
System.out.println("all values:");
o.subscribe(a -> System.out.printf("%d%%; ", a));
System.out.println("nnfilter by flatMap:");
o.flatMap(val -> {
if(val > 5)
return Observable.just(val);
else
return Observable.empty();
})
.subscribe(a -> System.out.printf("%d%%; ", a));
System.out.println("nnfilter by filter():");
o.filter(val -> val > 15)
.subscribe(a -> System.out.printf("%d%%; ", a));