簡體   English   中英

如何使用Java Optional轉換復雜條件

[英]How to use Java Optional to convert a complex if condition

考慮以下課程

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

我有一種方法應在2種情況下返回false

  • 如果RequestBodyResource對象的所有3個屬性為null / empty
  • 如果多個屬性不為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;

帶有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;

也缺乏對空字符串的檢查。

這樣就不需要“ 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;
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM