有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java在转换方法WebFlux中从lambda返回null或可为null的内容

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

映射可为空的方法:

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;
}

共 (1) 个答案

  1. # 1 楼答案

    在功能性/反应性的环境中工作时,您应该尽量避免所有空检查,并尝试从不从任何方法返回空

    相反,当存在空返回的风险时返回Optional<T>,当返回Mono的函数中出现错误时返回Mono.error。或者如果你只是想跳过返回某个内容,就返回Mono.empty

    通过使用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);
        }
    }
    

    在这里,我返回Optionals和a,并决定返回Mono。空的还是单声道的。错误取决于发生了什么