装修可观察
Decorating observable
在rx-java中修饰Observable<>
,Single<>
,Maybe<>
,Flowable<>
可以吗?
例如。像这样:
public final class NonEmptyStringSource extends Observable<String> {
private final Observable<String> source;
public NonEmptyStringSource(final Observable<String> source) {
this.source = source.filter(s -> s.length() > 0);
}
@Override
protected void subscribeActual(final Observer<? super String> observer) {
this.source.subscribe(observer);
}
}
这种方法有缺陷吗?
使用安全吗?
与 1.x 不同,2.x 中的这种模式没有惩罚,几乎与标准运算符的实现方式相似。根据您的需要,您可能希望实施 ObservableTransformer
:
ObservableTransformer<String, String> t =
upstream -> upstream.filter(s -> s.length() > 0);
Observable.fromArray("a", "b", "", "d", "", "f")
.compose(t)
.subscribe(System.out::println, Throwable::printStackTrace);
我建议不要这样做,因为它只会混淆实际发生的事情。
仅使用 filter
内联更清晰、更具可读性:
.filter(StringUtils::isNotBlank)
这来自 Apache Commons-Lang,但您可以同样轻松地推出自己的实现。
在rx-java中修饰Observable<>
,Single<>
,Maybe<>
,Flowable<>
可以吗?
例如。像这样:
public final class NonEmptyStringSource extends Observable<String> {
private final Observable<String> source;
public NonEmptyStringSource(final Observable<String> source) {
this.source = source.filter(s -> s.length() > 0);
}
@Override
protected void subscribeActual(final Observer<? super String> observer) {
this.source.subscribe(observer);
}
}
这种方法有缺陷吗?
使用安全吗?
与 1.x 不同,2.x 中的这种模式没有惩罚,几乎与标准运算符的实现方式相似。根据您的需要,您可能希望实施 ObservableTransformer
:
ObservableTransformer<String, String> t =
upstream -> upstream.filter(s -> s.length() > 0);
Observable.fromArray("a", "b", "", "d", "", "f")
.compose(t)
.subscribe(System.out::println, Throwable::printStackTrace);
我建议不要这样做,因为它只会混淆实际发生的事情。
仅使用 filter
内联更清晰、更具可读性:
.filter(StringUtils::isNotBlank)
这来自 Apache Commons-Lang,但您可以同样轻松地推出自己的实现。