装修可观察

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,但您可以同样轻松地推出自己的实现。