RXJava逻辑映射链

时间:2017-10-13 04:22:10

标签: java rx-java

我有以下用RXJava编写的代码。

validateProduct(payload)
.map.(r -> {
    if(r.getBoolean("valid")){
        return createProduct(productPayload);
    }else{
        return null; // request.end() | end the chain here with some message as invalid product.
    }
})
.map(r -> {
    return linkCategories(catPayload);
})
.map(r -> {
    return linkTags(tagPayload);
})
.doOnError(e -> log.error(e))
.subscribe(r -> {
    JsonObject response = new JsonObject().put("status", true);
    request.end(response);
}, e -> {
    JsonObject response = new JsonObject().put("status", false);
    request.end(response);
});

第一个块有条件检查,此代码现在不能正常工作。什么是在RX中处理条件链的最佳方法?

1 个答案:

答案 0 :(得分:1)

看起来你可能遇到了空指针异常。 RxJava v2中不接受空值。你的第一张地图可能会引发问题。

通常,当您需要rxjava中的条件逻辑并且可能没有返回对象时,您有两个选择:

  1. 返回一个表示null(并可能将其过滤掉)的对象
  2. 使用像flatMap这样的运算符并添加一个空的Observable
  3. 看起来你可能遇到了空指针异常。 RxJavav2中不接受空值。你的第一张地图可能会引发问题。

    选项1。

    validateProduct(payload)
    .map.(r -> {
        if(r.getBoolean("valid")){
            return createProduct(productPayload);
        }else{
            return createEmptyProduct(); // generate non null placeholder object
        }
    })
    .filter(r->{
        // check here via method call or instanceOf to filter out empty products
        r instanceof ValidProduct
    }).map(r -> {
        return linkCategories(catPayload);
    })
    .map(r -> {
        return linkTags(tagPayload);
    })
    .doOnError(e -> log.error(e))
    .subscribe(r -> {
        JsonObject response = new JsonObject().put("status", true);
        request.end(response);
    }, e -> {
        JsonObject response = new JsonObject().put("status", false);
        request.end(response);
    });
    

    选项2

    validateProduct(payload)
    .flatMap(r -> {
        if(r.getBoolean("valid")){
            return createProduct(productPayload); // Assuming this returns an observable if not use Observable.just(createProduct(productPayload))
        }else{
            return Observable.empty(); // request.end() | end the chain here with some message as invalid product.
        }
    })
    .map(r -> {
        return linkCategories(catPayload);
    })
    .map(r -> {
        return linkTags(tagPayload);
    })
    .doOnError(e -> log.error(e))
    .subscribe(r -> {
        JsonObject response = new JsonObject().put("status", true);
        request.end(response);
    }, e -> {
        JsonObject response = new JsonObject().put("status", false);
        request.end(response);
    });