Observable 中的过滤器不能应用于 Rxjava 2 中的 Function Boolean
filter in Observable cannot applied to Function Boolean in Rxjava 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());
}
});
在 rxjava2 中,我相信 filter
使用 Predicate
而不是 Function
例如
.filter(new Predicate<Integer>() {
@Override
public boolean test(Integer integer) {
Log.d("RxFlapmapActivity", "flapMapEx2222222 filter out odd numbers.........");
return integer.intValue() % 2 == 0;
}
})
可以用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 所说。
并且 Observable 而不是 flatMap 中的 ObservableSource。
但我认为 retrolambda/java8 使用 rxjava 更好。它们允许编写更少的代码并使用类型推断避免此类问题。
下面代码中的过滤器试图过滤掉奇数,但我无法编译代码,因为它在抱怨
错误:(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());
}
});
在 rxjava2 中,我相信 filter
使用 Predicate
而不是 Function
例如
.filter(new Predicate<Integer>() {
@Override
public boolean test(Integer integer) {
Log.d("RxFlapmapActivity", "flapMapEx2222222 filter out odd numbers.........");
return integer.intValue() % 2 == 0;
}
})
可以用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 所说。 并且 Observable 而不是 flatMap 中的 ObservableSource。
但我认为 retrolambda/java8 使用 rxjava 更好。它们允许编写更少的代码并使用类型推断避免此类问题。