2017-04-11 117 views
4

可以在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); 
    } 
} 

这种方法是否有一些缺陷?
使用安全吗?

+0

流有一个10k的均值阈值。如果您的可观察流小于您将支付的性能损失 – efekctive

+1

Rx2不支持空值,因此'!= null'将是多余的。 – tynn

回答

3

与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); 
1

我会反对这项建议,因为它只是混淆了什么是真正回事。

只需使用filter内联是更清洁和更可读:

.filter(StringUtils::isNotBlank) 

这个来自Apache的共享郎,但你可以很容易地推出自己的实现。