我想驗證以下條件,但我的 if 條件出現問題并回傳無效結果。我的驗證是:
無論是productId或productAltID可能具有價值或者兩者都可以null
。如果既productId和productAltID為空,那么productSellDate和productReturnDate值必須是。
如果productSellDate和productReturnDate是null,則productIdorproductAltID應該有價值。
請在下面找到我的代碼,我得到的結果不正確,不確定我在這里搞砸了什么:
public class validate {
public static void main(String[] args) {
String productId = null;
String productAltID = "adfafadsf";
Date productSellDate = null;
Date productReturnDate = new Date();
if (productId != null || productAltID != null || productSellDate !=null && productReturnDate != null) {
System.out.println("validation success");
} else {
System.out.println("validation failed");
}
}
}
// 有效場景
Combination 1: Valid Scenario
String productId = null;
String productAltID = null;
Date productSellDate = new Date();
Date productReturnDate = new Date();
Combination 2: Valid Scenario
String productId = null;
String productAltID = "3432fefsf";
Date productSellDate = new Date();
Date productReturnDate = new Date();
Combination 3: Valid Scenario
String productId = "sdf3234234324";
String productAltID = "3432fefsf";
Date productSellDate = null;
Date productReturnDate = null;
Combination 4: Valid Scenario
String productId = null;
String productAltID = "3432fefsf";
Date productSellDate = null;
Date productReturnDate = null;
uj5u.com熱心網友回復:
正如指出的,運營商&&系結更緊比||這樣的邏輯并沒有做你希望它是什么。請參閱Oracle 教程的運算子頁面。
一點文學編程對避免這種事情大有幫助。
boolean hasAnId = productId != null || productAltID != null;
boolean hasDates = productSellDate != null && productReturnDate != null;
if ( hasAnId || hasDates ) ...
uj5u.com熱心網友回復:
tl;博士
drekbour的答案是正確的,運算子優先級規則和缺少括號意味著您||和&&運算子的執行順序與您預期的不同。
這是使用Objects.nonNull和流以可讀格式執行您想要的邏輯的另一種方法。
Stream
.of( productId , productAltID )
.anyMatch( Objects :: nonNull ) // One or more ID fields have a value.
|| // … or …
Stream
.of( productSellDate , productReturnDate )
.allMatch( Objects :: nonNull ) // All dates have a value.
細節
Objects.nonNull
通過 drekbour修改代碼,我建議使用Objects.nonNull&Objects.isNull以便于閱讀。
另外,我會使用更具描述性的變數命名。
boolean atLeastOneIdHasValue = Objects.nonNull( productId ) || Objects.nonNull( productAltID ) ; // One or both ID fields have a value.
boolean bothDatesHaveValue = Objects.nonNull( productSellDate ) && Objects.nonNull( productReturnDate ) ; // Both dates have a value.
boolean valid = ( atLeastOneIdHasValue || bothDatesHaveValue ) ;
流
另一種方法使用流。
制作一個變數流:
Stream.of( productId , productAltID )
然后記錄是否有任何或全部符合我們的標準。
- 呼叫
Stream#anyMatch以查看此流的任何元素是否與提供的謂詞匹配。 - 呼叫
Stream#allMatch以查看此流的所有元素是否與提供的謂詞匹配。
在我們的例子中,謂詞只是對 的呼叫Objects.nonNull。
boolean atLeastOneIdHasValue = Stream.of( productId , productAltID ).anyMatch( x -> Objects.nonNull( x ) ) ; // One or more ID fields have a value.
boolean bothDatesHaveValue = Stream.of( productSellDate , productReturnDate ).allMatch( x -> Objects.nonNull( x ) ) ; // All dates have a value.
boolean valid = ( atLeastOneIdHasValue || bothDatesHaveValue ) ;
我們可以通過使用縮短的代碼方法參考作為我們謂語:Objects :: nonNull。
boolean atLeastOneIdHasValue = Stream.of( productId , productAltID ).anyMatch( Objects :: nonNull ) ; // One or more ID fields have a value.
boolean bothDatesHaveValue = Stream.of( productSellDate , productReturnDate ).allMatch( Objects :: nonNull ) ; // All dates have a value.
boolean valid = ( atLeastOneIdHasValue || bothDatesHaveValue ) ;
查看此代碼在 IdeOne.com 上實時運行。
避免Date上課
順便說一句,永遠不要使用任何一個Date類。這些現在是遺留的,是幾年前被JSR 310 中定義的現代java.time類取代的可怕日期時間類的一部分。
- 對于僅日期(年-月-日),請使用
LocalDate. - 在 UTC(零時分秒的偏移量)中看到的片刻,使用
Instant. - 在特定時區的片刻,使用
ZonedDateTime.
uj5u.com熱心網友回復:
讓我們這樣說:
public static boolean isValid(
String productId, String productAltId, Date sellDate, Date returnDate
) {
if (null == productId && null == productAltId) {
return null != sellDate && null != returnDate; // dates MUST have value
}
// here productId or productAltId have value, no need to check dates
return true;
}
測驗:
System.out.println(isValid(null, null, new Date(), new Date())); // true
System.out.println(isValid(null, "ab", new Date(), new Date())); // true
System.out.println(isValid("cd", "ab", null, null)); // true
System.out.println(isValid("cd", null, null, null)); // true
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/350599.html
下一篇:如何防止重復字串?
