Java If语句跳过| | If第一个条件为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

我有一个搜索功能,可以检查searchKey是否与Objects属性匹配。如果第一次检查为false,它将停止,而不是遍历所有属性。这是密码

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好吧,这只是说明问题中的代码很难阅读。