Return null 或 lambda 在转换方法 WebFlux 中可以为 null 的东西

Return null or something nullable from lambda in transformation mehtod WebFlux

在 Spring WebFlux 链中,我使用了一个映射操作,有时可能 return 为空,我收到警告:
Return null or something nullable from lambda in transformation mehtod.
我相信当数据为空时,它实际上并没有将输入映射到 null 但它会引发异常。
处理这种情况的最佳方法是什么?

可以为 null 的 Map 方法:

public Pojo parseJson(String json) {
    try {
        // parse 
        return pojo;
    } catch (Exception e) {
        e.printStackTrace();
    }
    return null;
}

我的反应链:

public Mono<Pojo> query(long id) {

    Integer value = idMapper.getValue(id);

    if (value != null) {
        return repo.query(value)

                        Parse Method
                             |
                             v
                .map(this::parse);
    }
    return null;
}

在 functional/reactive 世界中工作时,您应该尽量避免所有 null 检查,并尽量从任何方法中都不 return null。

而不是 return Optional<T> 当存在空 return 的风险时, return Mono.error 当函数中存在错误时returns Mono。或者 return Mono.empty 如果你只是想跳过 return 一些东西。

通过使用 optional,您可以将代码重写为更简洁的代码。

public Optional<Pojo> parseJson(String json) {
    // Return an optional if there is risk for a null.
    return Optional.ofNullable(new Pojo());
}

private final IdMapper idMapper = new IdMapper();
private final Repo repo = new Repo();

public Mono<Pojo> query(long id) {

    // By returning an optional from the idMapper 
    // you can chain on and avoid null checks.
    return idMapper.getValue(id).map(integer -> repo.query(integer)
            .map(s -> parseJson(s).map(Mono::just)
                    .orElse(Mono.empty())))
            .orElse(Mono.error(() -> new NotFoundException("No Pojo with ID could be found")));
}

class Pojo {
    // Some pojo class
}

class Repo {
    public Mono<String> query(long id) {
        return Mono.just("Foo");
    }
}

class IdMapper {

    public Optional<Integer> getValue(long id) {
        // Here return an Optional instead of null!
        return Optional.of(1);
    }
}

这里我 return 选项和 a 根据发生的情况做出 return 或 Mono.empty 或 Mono.error 的一些决定。