优雅的方式来获得过滤器的索引或首先使用RX Java

Nat*_*ann 10 java filter rx-java

我只是在练习RX Java,并希望在数组中找到与过滤器匹配的项目.我看不出任何明显的方法.我正在寻找可能压缩范围和迭代可观察的东西,但它很快变得比循环更冗长和复杂.

Sam*_*ter 19

曾经有mapWithIndexzipWithIndex在RxJava运营商,但他们被删除,请参阅这里为什么.

所以你必须编写一些库样板文件:

class Indexed<T> {
    final int index;
    final T value;
    public Indexed(T value, int index) {
        this.index = index;
        this.value = value;
    }
    @Override
    public String toString() {
        return index + ") " + value;
    }
}

Iterable<Integer> naturals = IntStream.iterate(0, i -> i + 1)::iterator;
Run Code Online (Sandbox Code Playgroud)

但是,你可以相当简洁地得到它:

Observable<String> obs = Observable.just("zero", "one", "two", "three");
obs.zipWith(naturals, (s, i) -> new Indexed<String>(s, i))
   .filter(e -> e.value.length() > 4)
   .subscribe(System.out::println);
Run Code Online (Sandbox Code Playgroud)

  • 如果您无法访问java 8流,则可以使用`Observable.range(0,list.size())`而不是`naturals`. (3认同)