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

时间:2016-02-11 17:02:27

标签: 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();
                    }
                });
    }

}

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

3 个答案:

答案 0 :(得分:20)

您不应该返回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();
    }
});

答案 1 :(得分:6)

目前尚不清楚你在说什么null

如果您询问Observable<PutResult>是否可以发出PutResult null,那么是。这将导致外部可观察者发出null

如果您询问Observable<PutResult>返回的Func1是否为空,则为no。如果您需要跟踪发出的项目数量,请返回Observable.empty(),(或Observable.just(null)或类似内容。)

答案 2 :(得分:2)

在RxJava 2中,null被视为无效值。在这些情况下你可以使用Maybe组件,如下面的

  Maybe<Result>

   or 

  You can use flatMapMaybe<Result>