请考虑以下事项:
import io.reactivex.Observable;
import io.reactivex.observables.GroupedObservable;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.TimeUnit;
public class TypeTest {
public static void main(String[] args) throws Exception {
CountDownLatch latch = new CountDownLatch(1);
Observable<Long> source = Observable.interval(1,TimeUnit.MILLISECONDS).take(20);
Observable<GroupedObservable<String,Long>> sgb =
source.groupBy(x -> (x%2==0)?"Even":"Odd");
// I'd like to introduce a variable for source.reduce but I get a type error.
// Observable<Long> sreduce = source.reduce(new Long(0),(x,y) -> (x+y));
source.reduce(new Long(0),(x,y)->(x+y)).subscribe(x -> {
System.out.println(x);
latch.countDown();
});
latch.await();
}
}
我可以订阅source.reduce,就好像它是一个Observable,但是我不能将它指定为它的类型。我应该分配什么类型?
答案 0 :(得分:2)
您正在使用来自包io.reactivex
的导入,这意味着您正在使用RxJava 2.在RxJava 2中,返回具有恰好一个项目的反应流的方法(如reduce
的结果),返回Single<T>
代替Observable<T>
。
大多数方法/运算符都是相同的,甚至还有.toObservable()
方法可以从特定方法转换为通用方法。
侧点1:您的grouped
运算符评估键,但不对结果执行任何操作;由于该Observable没有订阅,因此不会启动计时器。
侧点2:您不需要CountdownLatch
等待完成。你可以做一个
source.reduce(new Long(0), (x, y) -> (x + y))
.doOnSuccess(System.out::println)
.toFuture()
.get();
或
source.reduce(new Long(0), (x, y) -> (x + y))
.doOnSuccess(System.out::println)
.blockingGet();
答案 1 :(得分:0)
如果您检查reduce()
方法的签名,您会看到:
public final <R> Observable<R> reduce(R initialValue, Func2<R, ? super T, R> accumulator) {
在您的情况下,它将是Observable<Long>
:
Observable<Long> source = Observable.interval(1, TimeUnit.MILLISECONDS).take(20);
Observable<Long> sreduce = source.reduce(new Long(0), (x, y) -> (x + y));
正如代码在您的示例中所示,您正在执行source.reduce(....).subscribe(...)
,它已经返回Subscription
。