Java If语句跳过| | If第一个条件为false
我有一个搜索功能,可以检查searchKey是否与Objects属性匹配。如果第一次检查为false,它将停止,而不是遍历所有属性。这是密码Java If语句跳过| | If第一个条件为false,java,Java,我有一个搜索功能,可以检查searchKey是否与Objects属性匹配。如果第一次检查为false,它将停止,而不是遍历所有属性。这是密码 else if (address.getLastName() != null ? address.getLastName().toLowerCase().contains(searchKey) : false || address.getFirstName() != null ? address.getFirstNa
else if (address.getLastName() != null ? address.getLastName().toLowerCase().contains(searchKey) : false
|| address.getFirstName() != null ? address.getFirstName().toLowerCase().contains(searchKey) : false
|| address.getTitle() != null ? address.getTitle().toLowerCase().contains(searchKey) : false
|| address.getStreet() != null ? address.getStreet().toLowerCase().contains(searchKey) : false
|| Integer.toString(address.getPlz()).equals(searchKey)) {
outputList.add(address);
因此,如果姓氏是smith,名是sam,搜索键是sam,则在找到该姓氏后将停止!=山姆
失败的测试:
@Test
public void searchFirstNameTest() {
Address address1 = new Address();
address.setFirstName("sam");
address.setLastName("smith");
address1.setFirstName("bob");
input.add(address);
input.add(address1);
List<Address> result = testee.searchAddress("sam", input);
assertEquals(1, result.size());
assertEquals("sam", result.get(0).getFirstName());
}
@测试
public void searchFirstNameTest(){
地址1=新地址();
地址:setFirstName(“sam”);
地址:setLastName(“史密斯”);
地址1.setFirstName(“bob”);
输入。添加(地址);
输入。添加(地址1);
列表结果=受试者搜索地址(“sam”,输入);
assertEquals(1,result.size());
assertEquals(“sam”,result.get(0.getFirstName());
}
我哪里做错了?解决方案可能是,你需要把你的陈述放在括号里
else if ((address.getLastName() != null ? address.getLastName().toLowerCase().contains(searchKey) : false)
|| (address.getFirstName() != null ? address.getFirstName().toLowerCase().contains(searchKey) : false)
|| (address.getTitle() != null ? address.getTitle().toLowerCase().contains(searchKey) : false)
|| (address.getStreet() != null ? address.getStreet().toLowerCase().contains(searchKey) : false)
|| Integer.toString(address.getPlz()).equals(searchKey)) {
outputList.add(address);
否则,语句的执行顺序不正确。
| |
是惰性的。如果左侧为假,我们知道结果将为假,而右侧不进行计算
我建议你重写你的逻辑,让它更简单,而不是返回
我哪里做错了
你认为A?B:C | | D?E:F
意味着(A?B:C)| |(D?E:F)
,但它实际上意味着:
A?B:((C | D)E:F)
表达方式应为:
else if((address.getLastName()!=null?address.getLastName().toLowerCase().contains(searchKey):false)
||(address.getFirstName()!=null?address.getFirstName().toLowerCase().contains(搜索键):false)
||(address.getTitle()!=null?address.getTitle().toLowerCase().contains(搜索键):false)
||(address.getStreet()!=null?address.getStreet().toLowerCase().contains(搜索键):false)
||Integer.toString(address.getPlz()).equals(searchKey)){
outputList.add(地址);
虽然最好不使用三元条件运算符编写:
else if((address.getLastName()!=null&&address.getLastName().toLowerCase().contains(searchKey))
||(address.getFirstName()!=null&&address.getFirstName().toLowerCase().contains(搜索键))
||(address.getTitle()!=null&&address.getTitle().toLowerCase().contains(搜索键))
||(address.getStreet()!=null&&address.getStreet().toLowerCase().contains(搜索键))
||Integer.toString(address.getPlz()).equals(searchKey)){
outputList.add(地址);
可以在没有附加括号的情况下编写,但您不应该这样做:
else if(address.getLastName()!=null&&address.getLastName().toLowerCase().contains(searchKey)
||address.getFirstName()!=null&&address.getFirstName().toLowerCase().contains(搜索键)
||address.getTitle()!=null&&address.getTitle().toLowerCase().contains(搜索键)
||address.getStreet()!=null&&address.getStreet().toLowerCase().contains(搜索键)
||Integer.toString(address.getPlz()).equals(searchKey)){
outputList.add(地址);
当混合使用
&&
、|
和?:
运算符时,请始终使用显式括号。您可以用一个最小但完整的示例来演示此行为吗?如果您声称Java中的|
运算符被破坏,那么您的测试似乎更有可能出错if条件检查中的ernary运算符似乎是一个可怕的想法,其结果与预期的一样不可读。Pro提示:不要创建如此复杂的条件,它很难读取,也很难调试。请使用中间布尔值(例如boolean isLastNameOK=address.getLastName()!=null?address.getLastName().toLowerCase()。包含(searchKey):false;
),然后在您的条件下使用布尔值。它将更具可读性,要进行调试,您只需“显示”或在调试器中查看布尔值“| |是惰性的。如果左侧为false,我们知道结果将为false”@OhGodspeds好吧,这只是说明问题中的代码很难阅读。