2

以下代码中的过滤器试图过滤掉奇数,但我无法编译代码,因为它在抱怨

错误:(114, 25) 错误:不兼容的类型:> 无法转换为 Predicate

当我将 rxjava 1 与 Func1 一起使用时很好,我怎样才能使它与 rxjava 2 一起使用?

    List<Integer> ints = new ArrayList<>();
    for (int i=1; i<10; i++) {
        ints.add(new Integer(i));
    }
    Log.d("RxFlapmapActivity", "flapMapEx2 1,2,3,4,5,6,7,8,9");
    Observable.just(ints)
            .flatMap(new Function<List<Integer>, Observable<Integer>>() {
                @Override
                public Observable<Integer> apply(List<Integer> ints) {
                    return Observable.fromIterable(ints);
                }
            })
            .filter(new Function<Integer, Boolean>() {
                @Override
                public Boolean apply(Integer integer) {
                    Log.d("RxFlapmapActivity", "flapMapEx2222222 filter out odd numbers.........");
                    return integer.intValue() % 2 == 0;
                }
            })
            .flatMap(new Function<Integer, Observable<Integer>>() {
                @Override
                public Observable<Integer> apply(Integer integer) {
                    for (int i = 0; i < 1000000000; i++) {
                    }
                    return multiplyInt(integer, 2);
                }
            })
            .subscribeOn(Schedulers.io())
            .observeOn(AndroidSchedulers.mainThread())
            .subscribe(new Observer<Integer>() {
                @Override
                public void onSubscribe(Disposable d) {

                }
                @Override
                public void onComplete() {
                }
                @Override
                public void onError(Throwable e) {
                    e.printStackTrace();
                }
                @Override
                public void onNext(Integer integer) {
                    Log.d("RxFlapmapActivity", "flapMapEx2 onNext>>>" + integer.toString());
                }
            });
4

2 回答 2

4

在 rxjava2 我相信不filter使用例如PredicateFunction

.filter(new Predicate<Integer>() {
            @Override
            public boolean test(Integer integer) {
                Log.d("RxFlapmapActivity", "flapMapEx2222222 filter out odd numbers.........");
                return integer.intValue() % 2 == 0;
            }
        })
于 2017-01-12T16:09:26.060 回答
3

可以使用 retrolambda 或 java8 轻松编译

    List<Integer> ints = new ArrayList<>();
    for (int i=1; i<10; i++) {
        ints.add(i);
    }

    Log.d("RxFlapmapActivity", "flapMapEx2 1,2,3,4,5,6,7,8,9");
    Observable.just(ints)
            .flatMap(Observable::fromIterable)
            .filter(integer -> integer % 2 == 0)
            .flatMap(integer -> {
                for (int i = 0; i < 1000000000; i++) {
                }

                return multiplyInt(integer, 2);
            })
            .subscribeOn(Schedulers.io())
            .observeOn(AndroidSchedulers.mainThread())
            .subscribe(integer -> {}, Throwable::printStackTrace);

或者,如果您真的想拥有所有这些匿名课程,您应该更改一些签名

    List<Integer> ints = new ArrayList<>();
    for (int i=1; i<10; i++) {
        ints.add(i);
    }

    Log.d("RxFlapmapActivity", "flapMapEx2 1,2,3,4,5,6,7,8,9");
    Observable.just(ints)
            .flatMap(new Function<List<Integer>, ObservableSource<Integer>>() {
                @Override
                public ObservableSource<Integer> apply(List<Integer> ints1) throws Exception {
                    return Observable.fromIterable(ints1);
                }
            })
            .filter(new Predicate<Integer>() {
                @Override
                public boolean test(Integer integer) {
                    Log.d("RxFlapmapActivity", "flapMapEx2222222 filter out odd numbers.........");
                    return integer % 2 == 0;
                }
            })
            .flatMap(new Function<Integer, ObservableSource<Integer>>() {
                @Override
                public ObservableSource<Integer> apply(Integer integer) throws Exception {
                    for (int i = 0; i < 1000000000; i++) {
                    }
                    return multiplyInt(integer, 2);
                }
            })
            .subscribeOn(Schedulers.io())
            .observeOn(AndroidSchedulers.mainThread())
            .subscribe(new Observer<Integer>() {
                @Override
                public void onSubscribe(Disposable d) {

                }
                @Override
                public void onComplete() {
                }
                @Override
                public void onError(Throwable e) {
                    e.printStackTrace();
                }
                @Override
                public void onNext(Integer integer) {
                }
            });

正如@JohnWowUs 所说,您代码中的主要问题是过滤器中的函数而不是谓词。 并且在 flatMap 中使用 Observable 而不是 ObservableSource。

但我认为 retrolambda/java8 与 rxjava 更好。它们允许编写更少的代码并使用类型推断避免此类问题。

于 2017-01-12T18:10:30.207 回答