如何在RxJava中使用take()运算符作为列表?

时间:2017-08-23 08:32:30

标签: java rx-java

所以我有一个清单

 List<String> strings = new ArrayList<>();
 strings.add("a");
 strings.add("b");
 strings.add("c");
 strings.add("d");
 strings.add("e");
 strings.add("f");
 strings.add("g");

我想使用RxJava从列表中获取前3个元素并将其返回。我尝试只使用take()函数,但会将整个列表返回给我,因为它被视为一个对象。

我成功地做了这样的事情

Observable.just(strings)
            .concatMap(new Func1<List<String>, Observable<String>>() {
                @Override
                public Observable<String> call(List<String> strings) {
                    return Observable.from(strings);
                }
            })
            .take(3)
            .toList()
            .subscribe(new Observer<List<String>>() {
                @Override
                public void onCompleted() {

                }

                @Override
                public void onError(Throwable e) {

                }

                @Override
                public void onNext(List<String> strings) {
                    System.out.print(strings.toString());
                }
            });

但在我看来有许多操作要做。这是一个更好的方法吗?

1 个答案:

答案 0 :(得分:0)

使用method reference

可以简化这种方式
 Observable.just(strings)
            .concatMap(Observable::from)
            .take(3)
            .subscribe(System.out::println);

如果不允许使用Java 8功能,那么实际上没有任何方法可以简化它。 我在这里看到的唯一不是将它收集到List而是收听流本身。

Observable.just(strings)
            .concatMap(new Func1<List<String>, Observable<String>>() {
                @Override
                public Observable<String> call(List<String> strings) {
                    return Observable.from(strings);
                }
            })
            .take(3)
            .subscribe(new Observer<String>() {
                @Override
                public void onCompleted() {

                }

                @Override
                public void onError(Throwable e) {

                }

                @Override
                public void onNext(String string) {
                    System.out.print(string);
                }
            });