如果不存在,如何在可选上执行逻辑?

2022-08-31 10:07:29

我想用java8替换下面的代码:Optional

public Obj getObjectFromDB() {
    Obj obj = dao.find();
    if (obj != null) {
        obj.setAvailable(true);
    } else {
        logger.fatal("Object not available");
    }

    return obj;
}

下面的伪代码不起作用,因为没有方法,但无论如何它说明了我的目的:orElseRun

public Optional<Obj> getObjectFromDB() {
    Optional<Obj> obj = dao.find();
    return obj.ifPresent(obj.setAvailable(true)).orElseRun(logger.fatal("Object not available"));
}

答案 1

使用Java 9或更高版本,ifPresentOrElse很可能是您想要的:

Optional<> opt = dao.find();

opt.ifPresentOrElse(obj -> obj.setAvailable(true),
                    () -> logger.error("…"));

使用vavr或类似方法进行Currying可能会得到更整洁的代码,但我还没有尝试过。


答案 2

我不认为你可以在一个声明中做到这一点。最好做:

if (!obj.isPresent()) {
    logger.fatal(...);   
} else {
    obj.get().setAvailable(true);
}
return obj;

推荐