Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/357.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
rxjava:创建可配置的可观察对象_Java_Rx Java_Observable_Configurable - Fatal编程技术网

rxjava:创建可配置的可观察对象

rxjava:创建可配置的可观察对象,java,rx-java,observable,configurable,Java,Rx Java,Observable,Configurable,我是RxJava新手,我想知道如何创建一个可配置的可观察对象?让我们想象一下,我可以像这样编写一个DB-to-DB传输: srcDb.getObservable(Bean.class) .sql(选择sql) .params(选择params) .订阅( getSubscriber(Bean.class) .sql(insertSql) ); 我已经可以用订阅者实现这一点了,但是我如何才能以同样的方式为可观察对象本身获得一些小配置呢?有两种方法可以实现这一点: 选项#1:让您自己的对象进行配置

我是RxJava新手,我想知道如何创建一个可配置的可观察对象?让我们想象一下,我可以像这样编写一个DB-to-DB传输:

srcDb.getObservable(Bean.class)
.sql(选择sql)
.params(选择params)
.订阅(
getSubscriber(Bean.class)
.sql(insertSql)
);

我已经可以用订阅者实现这一点了,但是我如何才能以同样的方式为可观察对象本身获得一些小配置呢?

有两种方法可以实现这一点:

选项#1:让您自己的对象进行配置,然后让切换域的
execute()
query()
toObservable()

 srcDb
 .find(Bean.class)
 .sql(selectSql)
 .params(selectParams)
 .execute()
 .subscribe(
      trgDb.getSubscriber(Bean.class)
           .sql(insertSql)
 );
选项2:使用
.compose()
重新使用常用操作:

srcDb
.getObservable(Bean.class)
.compose(addSQLParameters())
.subscribe(
      trgDb.getSubscriber(Bean.class)
           .sql(insertSql)
 );

 <T> Transformer<T,T> addSQLParameters() {
   return obs -> obs.sql(selectSql).params(selectParams);
 }
srcDb
.getObservable(Bean.class)
.compose(addSQLParameters())
.订阅(
getSubscriber(Bean.class)
.sql(insertSql)
);
Transformer addSQLParameters(){
返回obs->obs.sql(selectSql.params)(selectParams);
}

我建议您使用选项1,因为它可以更好地管理您的代码部分。

也许我找到了一种可以接受的方法。这里我需要做的似乎是在可观察实例化本身之外的双重绑定。例如,我需要一个DbObservable和DbOnSubscribe对,它们相互依赖,类似这样:

数据库可观察类:

public class DbObservable<T> extends Observable<T> {

    //Some parameter
    private String sql;

    protected DbObservable(DbOnSubscribe<T> onSub) {
        super(onSub);
    }

    //Getter for DbOnSubscribe
    public String getSql() {
        return sql;
    }

    //Chain parameter modifier
    public DbObservable<T> sql(String sql) {
        this.sql = sql;
        return this;
    }
}
。。。它真的有效!它打印出“一些SQL”

结论

  • 如果你想变得超级干净,不介意多写一两行代码,那就去找Joel和Tassos Bassoukos推荐的构建器吧
  • 如果您不害怕更复杂的代码(应该总是封装在某个地方),并且您确实希望这些参数位于您自己的可观察范围内,那么您可以尝试双重绑定方式
  • 还有其他选择吗

  • 你不能那么容易地在CoreRXAPI中添加你自己的方法,但是你能做的是用同样流畅的写作风格编写你自己的构建器,并让那些构建器在最后返回一个可观察的结果。这样做,你就能保持流畅的写作。你和乔尔(带着他的评论)可能是对的。我尝试使用反射进行一些实验,以公开父类的onSubscribe字段,这实际上允许我做我想要的事情,但这不是一个干净的解决方案:-)。无论如何,如果RxJava为声称“知道自己在做什么”的开发人员提供了一些版本的Observable和getOnSubscribe()方法,那就太好了:-D.您可能对
    RxJavaHooks\setOnObservableCreate
    感兴趣,但请记住这适用于所有Observable。在我看来,你遇到了一个XY问题-在你创建一个可观察对象之前,只需进行配置即可。谢谢,我会研究它:-)。
    public class DbOnSubscribe<T> implements Observable.OnSubscribe<T> {
    
        private DbObservable<T> dbObservable;
    
        @Override
        public void call(Subscriber<? super T> subscriber) {
            String sql = dbObservable.getSql(); //Access SQL param
            subscriber.onNext( (T) sql ); //Use subscriber
            subscriber.onCompleted();
        }
    
        //Set back-reference
        public void setDbObservable(DbObservable<T> dbObservable) {
            this.dbObservable = dbObservable;
        }
    }
    
    public class DbConnector {
    
        public DbObservable<String> getObservable() {
            DbOnSubscribe<String> onSub = new DbOnSubscribe<String>();
            DbObservable<String> obs = new DbObservable<>(onSub);
            onSub.setDbObservable(obs);
            return obs;
        }
    }
    
    public class DbObservableTest {
    
        public static void main(String[] args) {
            DbConnector srcDb = new DbConnector();
    
            srcDb.getObservable()
                    .sql("some SQL")
                    .subscribe(System.out::println);
        }
    }