RxJava - 返回时使用flatmap可能为null

Sre*_*ree 7 java rx-java

让我们使用这个类作为例子:

 public static class CurrentUser{
    public static Observable<User> get(){
         //code basically returns the currently logged in User object
         //but sometimes there may not be a logged in user 
    }

    public static Observable<PutResult> logOut(){
        return get()

                //I only want to execute the following if user != null

                .flatMap(new Func1<User, Observable<PutResult>>() {
                    @Override
                    public Observable<PutResult> call(User user) {
                        //delete the session token and save
                        user.removeSessionToken();
                        return DatabaseModule.getStorIOSQLite()
                                .put()
                                .object(user)
                                .prepare()
                                .asRxObservable();
                    }
                });
    }

}
Run Code Online (Sandbox Code Playgroud)

我应该在flatmap中返回null吗?这是否有任何影响,因为它期待一个Observable?

knu*_*ker 21

你不应该回来null,Observable.empty()而是.

.flatMap(new Func1<User, Observable<PutResult>>() {
    @Override
    public Observable<PutResult> call(User user) {
        if (user == null) return Observable.empty();

        //delete the session token and save
        user.removeSessionToken();
        return DatabaseModule.getStorIOSQLite()
                .put()
                .object(user)
                .prepare()
                .asRxObservable();
    }
});
Run Code Online (Sandbox Code Playgroud)

  • 在这种情况下,您可以使用`Observable.just(null)`(或某种形式的非null PutResult,其中包含不存在的用户的信息).它不会立即完成,但您必须对每个后续运算符执行空值检查.还有"never",它永远不会自己完成,所以你必须使用像`limit`或flatMap这样的`empty`来最终. (2认同)

Mal*_*alt 6

目前尚不清楚null你在谈论什么.

如果你问是否Observable<PutResult>可以发出PutResult那个null,那么是的.这将导致null外部可观察者发射.

如果你问的是Observable<PutResult>返回的是否Func1为null,那么不.返回Observable.empty(),(或者Observable.just(null)如果您需要跟踪发射物品的数量,则返回相似).