14

在 rxjava 1 的 Observable 类中有一个 from 方法,但在 rxjava 2 中找不到。如何在以下代码中替换 rxjava 2 中的 from 方法:

    List<Integer> ints = new ArrayList<>();
    for (int i=1; i<10; i++) {
        ints.add(new Integer(i));
    }
    Observable.just(ints)
            .flatMap(new Function<List<Integer>, Observable<Integer>>() {
                @Override
                public Observable<Integer> apply(List<Integer> ints) {
                    return Observable.from(ints);
                }
            })
4

4 回答 4

21

您可以使用Observable.fromIterable(source)

文档

一些运算符重载已使用后缀重命名,例如 fromArray、fromIterable 等。原因是当使用 Java 8 编译库时,javac 通常无法消除功能接口类型之间的歧义。

List<Integer> ints = new ArrayList<>();
for (int i=1; i<10; i++) {
    ints.add(new Integer(i));
}
Observable.just(ints)
        .flatMap(new Function<List<Integer>, Observable<Integer>>() {
            @Override
            public Observable<Integer> apply(List<Integer> ints) {
                return Observable.fromIterable(ints);
            }
        })
于 2017-01-12T07:47:12.863 回答
9

您不需要使用.just(),因为您可以Observable通过运算符直接从列表中创建fromIterable()

    Observable.fromIterable(ints)
于 2017-01-12T09:15:54.500 回答
6

我想这有点晚了,但我只是想让人们知道,RxJava 文档from中与运算符相关的 API 更改:

from消歧为fromArray, fromIterable,fromFuture

于 2018-04-09T02:11:33.380 回答
0

如果您需要一个 List,那么您可以简单地使用 JavaStream并从中创建一个List,然后将其直接传递给该Observable.fromIterable方法。像这样:

Observable.fromIterable(IntStream.rangeClosed(lowerLimitInclusive,upperLimitInclusive)
            .boxed()
            .collect(Collectors.toList()));   

或者

Observable.fromIterable(Stream.iterate(lowerLimitInclusive, integer -> integer + 1)
                .filter(integer -> integer < (upperLimit+1))
                .limit((long(upperLimit+1)-long(lowerLimitInclusive))
                .collect(Collectors.toList()));  
于 2019-11-06T17:52:01.617 回答