我想验证以下条件,但我的 if 条件出了问题并返回无效结果。我的验证是:
要么productId
或productAltID
可以具有值,或者两者都可以null
如果 和productId
都productAltID
为空,则productSellDate
和productReturnDate
必须具有值。
如果productSellDate
和productReturnDate
是null
,那么productId
或productAltID
应该有价值。
请在下面找到我的代码,我得到了不正确的结果,不确定我在这里搞砸了什么:
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");
}
}
}
Run Code Online (Sandbox Code Playgroud)
// 有效场景
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;
Run Code Online (Sandbox Code Playgroud)
如前所述,运算符绑定得更紧,因此逻辑没有按照您希望的方式执行。请参阅Oracle 教程的运算符页面。&&
||
一点点文学编程对于避免此类事情大有帮助。
boolean hasAnId = productId != null || productAltID != null;
boolean hasDates = productSellDate != null && productReturnDate != null;
if ( hasAnId || hasDates ) ...
Run Code Online (Sandbox Code Playgroud)
drekbour 的答案是正确的,运算符优先规则和缺少括号意味着您||
和&&
运算符的执行顺序与您的预期不同。
这是另一种方法,使用Objects.nonNull
和 流以可读的格式执行您想要的逻辑。
Stream\n.of( productId , productAltID )\n.anyMatch( Objects :: nonNull ) // One or more ID fields have a value.\n|| // \xe2\x80\xa6 or \xe2\x80\xa6\nStream\n.of( productSellDate , productReturnDate )\n.allMatch( Objects :: nonNull ) // All dates have a value.\n
Run Code Online (Sandbox Code Playgroud)\nObjects.nonNull
通过 drekbour修改代码,我建议使用Objects.nonNull
&Objects.isNull
以便于阅读。
另外,我会使用更具描述性的变量命名。
\nboolean atLeastOneIdHasValue = Objects.nonNull( productId ) || Objects.nonNull( productAltID ) ; // One or both ID fields have a value.\nboolean bothDatesHaveValue = Objects.nonNull( productSellDate ) && Objects.nonNull( productReturnDate ) ; // Both dates have a value.\nboolean valid = ( atLeastOneIdHasValue || bothDatesHaveValue ) ;\n
Run Code Online (Sandbox Code Playgroud)\n另一种方法使用流。
\n创建变量流:
\nStream.of( productId , productAltID )\n
Run Code Online (Sandbox Code Playgroud)\n然后统计是否有任何或全部符合我们的标准。
\nStream#anyMatch
以查看该流的任何元素是否与提供的谓词匹配。Stream#allMatch
以查看该流的所有元素是否与提供的谓词匹配。在我们的例子中,谓词只是对 的调用Objects.nonNull
。
Stream.of( productId , productAltID )\n
Run Code Online (Sandbox Code Playgroud)\n我们可以通过使用方法引用作为我们的谓词来缩短该代码: Objects :: nonNull
。
boolean atLeastOneIdHasValue = Stream.of( productId , productAltID ).anyMatch( x -> Objects.nonNull( x ) ) ; // One or more ID fields have a value.\nboolean bothDatesHaveValue = Stream.of( productSellDate , productReturnDate ).allMatch( x -> Objects.nonNull( x ) ) ; // All dates have a value.\nboolean valid = ( atLeastOneIdHasValue || bothDatesHaveValue ) ;\n
Run Code Online (Sandbox Code Playgroud)\n\nDate
上课顺便说一句,永远不要使用Date
class、nor Calendar
、SimpleDateFormat
、等。这些现在已经成为遗留问题,是多年前被 JSR 310 中定义的现代java.timeTimestamp
类取代的可怕日期时间类的一部分。
LocalDate
.Instant
.ZonedDateTime
。 归档时间: |
|
查看次数: |
1019 次 |
最近记录: |