if else 语句中的多个布尔值在 Java 中始终为 false

Multiple boolean values in if else statement is always false in Java

提问人:Angge 提问时间:6/26/2021 更新时间:6/26/2021 访问量:1187

问:

我坚持使用这种方法,因为 if else 条件说

  • Condition usersInSales && usersInPayments is always false
  • Condition usersInSales && usersInLoans is always false
  • Condition usersInPayments && usersInLoans is always false

我尝试了不同的条件组合并添加了错误值以尝试解决它,但没有帮助。请问我能帮忙吗?提前致谢

private List<UserResource> usersFilteredByDepartment(List<UserResource> users, boolean usersInSales, boolean usersInPayments, boolean usersInLoans) {

        if (usersInSales) {
            return getUsersInSales(users);
        } else if (usersInPayments) {
            return getUsersInPayments(users);
        } else if (usersInLoans) {
            return getUsersInLoans(users);
        } else if (usersInSales && usersInPayments) {
            return Stream.concat(getUsersInSales(users).stream(), getUsersInPayments(users).stream()).distinct().collect(Collectors.toList());
        } else if (usersInSales && usersInLoans) {
            return Stream.concat(getUsersInSales(users).stream(), getUsersInLoans(users).stream()).distinct().collect(Collectors.toList());
        } else if (usersInPayments && usersInLoans) {
            return Stream.concat(getUsersInPayments(users).stream(), getUsersInLoans(users).stream()).distinct().collect(Collectors.toList());
        } else return users;
    }
java spring 布尔逻辑

评论

0赞 Sweeper 6/26/2021
分支运行的必要条件是检查失败。但是,如果失败了,那就错了,那么也一定是假的。你是想检查一下吗?if (usersInSales && usersInPayments)if (usersInSales)userInSalesusersInSales && usersInPaymentsusersInSales && usersInPayments
0赞 DevilsHnd - 退した 6/26/2021
将包含两个布尔条件的语句移动到链的顶部ifif
0赞 Panagiotis Bougioukos 6/26/2021
@Angge 检查我更新的答案。如果 else 检查您的代码,您可能不需要所有这些。
0赞 Angge 6/27/2021
谢谢大家,我已经颠倒了逻辑,效果很好。

答:

1赞 Mark Rotteveel 6/26/2021 #1

考虑你的逻辑:你首先检查,如果它是真的,则返回。然后你检查并返回它是否属实。因此,当您检查时,两者都将是假的,因为您已经处理了其中任何一个为真的情况。usersInSalesusersInPaymentsusersInSales && usersInPayments

您需要更改逻辑,以便以累加而不是独占方式处理条件。

3赞 Panagiotis Bougioukos 6/26/2021 #2
if (usersInSales) {
        return getUsersInSales(users);
    } else if (usersInPayments) {    ---> You get here when userInSales = false
        return getUsersInPayments(users);
    } else if (usersInLoans) {  --> You get here when usersInSales = false && usersInPayments = false
        return getUsersInLoans(users);
    }  else if () {  --> You get here when usersInSales = false && usersInPayments = false && usersInLoans = false. No use in comparing what you compare here. It will be always false as it reports to
     }

希望你现在能想出路

您可以尝试首先检查最具体的约束,然后最终转到更一般的约束。

if (usersInSales && usersInPayments) {
        return Stream.concat(getUsersInSales(users).stream(), getUsersInPayments(users).stream()).distinct().collect(Collectors.toList());
    } else if (usersInSales && usersInLoans) {
        return Stream.concat(getUsersInSales(users).stream(), getUsersInLoans(users).stream()).distinct().collect(Collectors.toList());
    } else if (usersInPayments && usersInLoans) {
        return Stream.concat(getUsersInPayments(users).stream(), getUsersInLoans(users).stream()).distinct().collect(Collectors.toList());
    } else if (usersInSales) {
        return getUsersInSales(users);
    } else if (usersInPayments) {
        return getUsersInPayments(users);
    } else if (usersInLoans) {
        return getUsersInLoans(users);
    } else return users;

但是,检查您的工作流程 IMO 如果没有所有这些 if,else 检查,您的方法会更有意义。这就足够了

 private List<UserResource> usersFilteredByDepartment(List<UserResource> users, boolean usersInSales, boolean usersInPayments, boolean usersInLoans) {
    
     return Stream.concat(
usersInPayments? getUsersInPayments(users).stream(): Stream.empty(),
usersInLoans? getUsersInLoans(users).stream(): Stream.empty(), 
usersInSales? getUsersInSales(users).stream(): Stream.empty()
).distinct().collect(Collectors.toList());
    
}
1赞 DEV 6/26/2021 #3

您的最后 3 个条件将永远不会运行。因为你的前 3 个条件之一已经成立。要解决此问题,您需要颠倒条件的顺序,请尝试以下操作:

if (usersInSales && usersInPayments) {
    } else if (usersInSales && usersInLoans) {
    } else if (usersInPayments && usersInLoans) {
    } else if (usersInSales ) {
    } else if ( usersInLoans) {
    } else if (usersInLoans) {
    } else return users;
3赞 Alan 6/26/2021 #4

您有两种解决方案。

  1. 重新排序您的条件,正如其他人所展示的那样。在你的代码中,当你命中你已经处理过一半为真的情况时,你已经处理过了。(两个子句)比单个子句更具限制性。&&&&

  2. 或者,将双子句放在前面的 ifs 中。

     if (usersInSales) {
         return getUsersInSales(users);
     } else if (usersInPayments) {
         return getUsersInPayments(users);
     } else if (usersInLoans) {
         return getUsersInLoans(users);
     } else if (usersInSales && usersInPayments) {
         return Stream.concat(getUsersInSales(users).stream(), getUsersInPayments(users).stream()).distinct().collect(Collectors.toList());
     } else if (usersInSales && usersInLoans) {...
    

成为

    if (usersInSales) {
        if (usersInPayments) { // Nested if is like && operator.
            return Stream.concat(getUsersInSales(users).stream(), getUsersInPayments(users).stream()).distinct().collect(Collectors.toList());
        } else {
            return getUsersInSales(users);
        }
    } else if (usersInPayments) { ...

这更有效率,我认为通常更可取。