gpt4 book ai didi

java - 将 Java 8 Optionals 与条件 AND 相结合

转载 作者:搜寻专家 更新时间:2023-10-31 08:16:30 25 4
gpt4 key购买 nike

我的问题是我有两个或更多 Optionals 包装不同的类型。我想执行一个只有在所有可选值都不为空时才能执行的操作。

目前我是这样做的:

    Optional<PatientCase> caseOptional = patientCaseRepository.findOneById(caseId);
Optional<User> userOptional = userRepository.findOneById(caseId);

if(userOptional.isPresent() && caseOptional.isPresent()) {
caseOptional.get().getProcess().setDesigner(userOptional.get());
}

在我看来,if 条件感觉不对。我知道可以使用 orElse 链接 Optionals。但就我而言,我不想要一个合乎逻辑的 Else。有没有一种方法可以创建 and AND 运算符以组合两个或多个 Optionals类似于此伪代码?

caseOptional.and.userOptional.ifPresent((theCase,user) -> //Perform Stuff);

最佳答案

有一个逻辑 AND 操作,但是没有(简单的)方法可以将它变成一个双值 Optional,换句话说,这(又一次)因为没有 pair or元组类型。例如

caseOptional.flatMap(theCase -> userOptional
.map(user -> new AbstractMap.SimpleEntry<>(theCase, user)))
.ifPresent(e -> e.getKey().getProcess().setDesigner(e.getValue()));

它使用 AbstractMap.SimpleEntry 作为不存在的元组类型的替代。

另一种方法是使用单例映射作为对:

caseOptional.flatMap(theCase -> userOptional
.map(user -> Collections.singletonMap(theCase, user)))
.ifPresent(m -> m.forEach((c, u) -> c.getProcess().setDesigner(u)));

但在这种特定情况下,您可以使用更简单的

caseOptional.map(PatientCase::getProcess)
.ifPresent(p -> userOptional.ifPresent(p::setDesigner));

caseOptional.ifPresent(c -> userOptional.ifPresent(u -> c.getProcess().setDesigner(u)));

相反。

关于java - 将 Java 8 Optionals 与条件 AND 相结合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39656484/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com