java - 如何使用 Java Optional 转换复杂的 if 条件

标签 java if-statement option-type

考虑下面的类

Class RequestBodyResource {
    private RequestVariable1 att1;
    private String att2;
    private String att3;
}

我有一个方法应该在两种情况下返回 false

  • 如果 RequestBodyResource 对象的所有 3 个属性都为 null/空
  • 如果多个属性不为空

基本上是“至少一个”或“至多一个”

相同的代码是

public boolean validateExactlyOneRequiredRequestParam(RequestBodyResource request) {

    //The below 3 conditions are to test that only one request is present
    if(StringUtils.isNotEmpty(request.getAtt3()) && null != request.getAtt1()) {
        return false;
    }
    if(StringUtils.isNotEmpty(request.getAtt2()) && null != request.getAtt1()) {
        return false;
    }
    if(StringUtils.isNotEmpty(request.getAtt3()) && StringUtils.isNotEmpty(request.getAtt2())) {
        return false;
    }

    //The below condition is to test that at least one request is present
    if(StringUtils.isEmpty(request.getAtt3()) && null == request.getAtt1() && StringUtils.isEmpty(request.getAtt2())) {
        return false;
    }
    return true;
}

如何使用 Java 8 Optional 使这段代码更易于编写和阅读?

最佳答案

为什么不只是数数呢?

int count = 0;
if(request.getAtt1() !=null) {
    count++;
}
if(StringUtils.isNotEmpty(request.getAtt2())) {
    count++;
}
if(StringUtils.isNotEmpty(request.getAtt3())) {
    count++;
}

return count == 1;

带有可选的版本(不要使用,添加它只是为了好玩)。

    return Optional.ofNullable(request.getAtt1()).map(ignore -> 1).orElse(0)
            + Optional.ofNullable(request.getAtt2()).map(ignore -> 1).orElse(0)
            + Optional.ofNullable(request.getAtt3()).map(ignore -> 1).orElse(0) 
           == 1;

也缺少对空字符串的检查。

关于java - 如何使用 Java Optional 转换复杂的 if 条件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54664276/

相关文章:

java - 如何找到自动装箱?

objective-c - Objective C stringWithFormat if 语句

java - 不兼容的类型 - 必需的 Long Found void + 可选<>

Java boolean 值未从 if 语句中传递出去

mySQL:为什么 if(condition,then ,'' ) != '' 与 if(condition,then,0) != 0 不同

ios - 为什么这个变量是 "nil",即使我有一个 "if"语句检查它不是

arrays - Swift 如何在过滤数组时安全地解包可选属性?

java - 如何用Java获取SMTP服务器的证书

java - 为什么在循环中使用之前将字段引用复制到本地?

Java - 来自不同对象类型的相同属性的比较器类