Rx java 实施定制主题<;T、 E>;在RxJava中

Rx java 实施定制主题<;T、 E>;在RxJava中,rx-java,Rx Java,我有一个PublishSubject,它接收Strings并发出Articles private PublishSubject<String> articleSubject; public Observable<Article> newArticleSubject() { articleSubject = PublishSubject.create(); return articleSubject.flatMap(new Func1<String,

我有一个
PublishSubject
,它接收
String
s并发出
Article
s

private PublishSubject<String> articleSubject;

public Observable<Article> newArticleSubject() {
    articleSubject = PublishSubject.create();
    return articleSubject.flatMap(new Func1<String, Observable<Article>>() {
        @Override
        public Observable<Article> call(String articleId) {
            return dataModel.getArticleById(articleId);
        }
    });
}

articleSubject.onNext("1234");

但是,如何处理构造函数中的
OnSubscribe
?我必须保留订户和所有的东西吗?是否有办法将其委托给
出版主题

我找到了一个通用解决方案:

public abstract class SubjectBinding<T, E> implements Observer<T> {

    private PublishSubject<T> origin;

    public SubjectBinding() {
        this.origin = PublishSubject.create();
    }

    @Override
    public void onCompleted() {
        origin.onCompleted();
    }

    @Override
    public void onError(Throwable e) {
        origin.onError(e);
    }

    @Override
    public void onNext(T t) {
        origin.onNext(t);
    }

    public Observable<E> asObservable() {
        return origin.flatMap(new Func1<T, Observable<E>>() {
            @Override
            public Observable<E> call(T t) {
                return asObservable(t);
            }
        });
    }

    protected abstract Observable<E> asObservable(T t);

}
它发出
文章
s:

public Observable<Article> newArticleSubject() {
    return new ArticleSubject().asObservable();
}
公共可观察的newArticleSubject(){
返回新的ArticleSubject().asObservable();
}

这感觉像是一个XY问题-您试图通过使用主题解决什么问题?我想要一个主题,当接收到字符串(
subject.onNext(“1”)
)时,它会发出一篇
文章。是的,这从最初的问题中非常清楚。然而,这本身就是“我想做X,我可以通过Y来做”。你为什么特别需要一个主题?为什么你不能有一个可观察的链呢?如果你真的想用主题来做这件事,我的博文是关于如何创建自定义
Subject
s的。
 private class ArticleSubject extends SubjectBinding<String, Article> {
        @Override
        protected Observable<Article> asObservable(String s) {
            return dataModel.getArticleById(s);
        }
    }
articleSubject.onNext("1234");
public Observable<Article> newArticleSubject() {
    return new ArticleSubject().asObservable();
}