如何使用Java Optional转换复杂条件

时间:2019-02-13 06:57:05

标签: java if-statement optional

考虑以下课程

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

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

  • 如果RequestBodyResource对象的3个属性全部为空/空
  • 如果多个属性不为空

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

相同的代码与

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使此代码更易于编写和阅读?

2 个答案:

答案 0 :(得分:3)

为什么不算数?

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

return count == 1;

带有Optional的版本(请勿使用,只是为了好玩而添加)。

    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;

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

答案 1 :(得分:2)

这里不需要Optional。如果您只需要检查这些属性中至少有 个,则只需将其检查为:

public boolean validateAtLeastOneRequiredRequestParam(RequestBodyResource request) {
    return request.getAtt1() != null 
            || !StringUtils.isEmpty(request.getAtt3()) 
            || !StringUtils.isEmpty(request.getAtt2());
}

编辑1 :对于 正好一个 检查,它的可读性(IMHO)还不如您当前的解决方案是:

public boolean validateExactlyOneRequiredRequestParam(RequestBodyResource request) {
    long countPresentAttribute = Stream.of(request.getAtt2(), request.getAtt3())
            .filter(StringUtils::isNotEmpty)
            .count() + 
            Stream.of(request.getAtt1()).filter(Objects::nonNull).count();
    return countPresentAttribute == 1;
}

编辑2 :使用Optional并摆脱对StringUtils的外部依赖,您可以按照以下步骤进行操作:

public boolean validateExactlyOneRequiredRequestParam(RequestBodyResource request) {
    long countPresentAttribute = Stream.of(
                Optional.ofNullable(request.getAtt1()),
                Optional.ofNullable(request.getAtt2()).filter(String::isEmpty),
                Optional.ofNullable(request.getAtt3()).filter(String::isEmpty))
            .filter(Optional::isPresent)
            .count();
    return countPresentAttribute == 1;
}