Rx java 什么';除了System.currentTimeMillis()之外,使用.defer()也是一个很好的用例

Rx java 什么';除了System.currentTimeMillis()之外,使用.defer()也是一个很好的用例,rx-java,reactive-programming,rx-java2,Rx Java,Reactive Programming,Rx Java2,我有以下代码: Single<Player> createPlayerSingle() { Integer playerId = Random.nextInteger(); return playersDao.createSingle(id); } 其想法是,如果我们创建另一个createPlayerSingle()订阅,我们将不会生成新id(基本上我们将重用旧id) 我不明白为什么会这样。那么,我们是否应该将defer添加到以某个同步代码块开头的每个函数中 Sin

我有以下代码:

Single<Player> createPlayerSingle() {
    Integer playerId = Random.nextInteger();
    return playersDao.createSingle(id);
}
其想法是,如果我们创建另一个
createPlayerSingle()
订阅,我们将不会生成新id(基本上我们将重用旧id)

我不明白为什么会这样。那么,我们是否应该将
defer
添加到以某个同步代码块开头的每个函数中

Single<T> methodSingle() {
    return Single.defer(() -> {
        Integer id = Random.nextInteger(); // sync block of code
        ....
        return dao.createSingle(id);
    });
}

当您编写一个返回单个(或任何其他RxJava流类型)的方法时,您返回的是可以多次订阅(可能是并发订阅)的内容

Defer
是一个功能强大(但很简单)的操作符,允许您定义每个订阅状态。例如,如果您想要第一次发射的特殊行为:

Observable<Integer> numbers = Observable.just(1, 2, 3);
Observable<Integer> numbers2 = 
    Observable.defer(() -> {
        boolean[] first = new boolean[] {true};
        return numbers.doOnNext(x -> {
            if (first[0]) {
                System.out.println("first=" + x);
                first[0] = false;
            } else {
                System.out.println(x);
            }
        });
    });
numbers2.subscribe();
numbers2.subscribe();
关于此代码:

Single<T> methodSingle(Object object) {
    return Single.defer(() -> {
        Integer id = object.id; // sync block of code
        ....
        return dao.createSingleFrom(id);
    });
}
singlemethodsingle(对象){
返回单个。延迟(()->{
整数id=object.id;//同步代码块
....
返回dao.createSingleFrom(id);
});
}

如果
对象
是不可变的,那么这是毫无意义的,您可以像您怀疑的那样忽略
延迟

每次我觉得需要处理.create(),我意识到使用.defer()很简单。.defer()prep代码通常是启动查询并将结果推送到可观察的.just()中的代码

Observable<Integer> numbers = Observable.just(1, 2, 3);
Observable<Integer> numbers2 = 
    Observable.defer(() -> {
        boolean[] first = new boolean[] {true};
        return numbers.doOnNext(x -> {
            if (first[0]) {
                System.out.println("first=" + x);
                first[0] = false;
            } else {
                System.out.println(x);
            }
        });
    });
numbers2.subscribe();
numbers2.subscribe();
first=1
2
3
first=1
2
3
Single<T> methodSingle(Object object) {
    return Single.defer(() -> {
        Integer id = object.id; // sync block of code
        ....
        return dao.createSingleFrom(id);
    });
}