在RxJava中,reduce表达式的类型是什么

时间:2017-01-18 20:16:45

标签: rx-java reactive-programming

请考虑以下事项:

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,但是我不能将它指定为它的类型。我应该分配什么类型?

2 个答案:

答案 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