【问题标题】:java: most concise way to compare one variable against several others [duplicate]java:将一个变量与其他几个变量进行比较的最简洁方法[重复]
【发布时间】:2015-01-15 01:13:13
【问题描述】:

我经常发现自己在写这样的 if 语句......

if (name.equals("fred") || name.equals("bob") || name.equals("jack")){

}

或使用原语...

if (numb==4 || numb==45 || numb=91){

}

有没有更简洁的方法来做到这一点?

编辑:我的问题确实是重复的。对于阅读本文的任何人,我建议也看看其他线程 - 他们有一些好东西。

【问题讨论】:

标签: java if-statement syntax


【解决方案1】:

您可以使用switchcase 语句:

例如,而不是:

if (numb==4 || numb==45 || numb=91){
    //do stuff
}

你可以这样做:

switch(numb){
    case 4:
    case 45:
    case 91:
        //do something regarding the numbers 4 45 and 91
        break;
    default:
        break;
}

如果您很看重可读性(因为这是这个问题所关心的),您还可以在布尔检查之间创建换行符:

if(name.veryLongMethodHere("fred") ||
   name.veryLongMethodHere("bob") ||
   name.veryLongMethodHere("food")){
    //do more stuff   
}

如果您有非常长且复杂的方法,这是一种组织代码的好方法。

更好的是,对字符串对象使用正则表达式: if(name.matches("bob|food|fred"){ //做点什么 }

【讨论】:

  • 在我看来并不简洁...
  • 如果你有 30 个选择,那就是,而且 imo 更具可读性。
  • @August 我发现它更具可读性和易于格式化。
  • 如果你有 && 而不是 || 会发生什么?
  • @KickButtowski 什么数同时等于 4、45 和 91?这是一个荒谬的情况。
【解决方案2】:

真正的答案是你不应该总是追求更“简洁”。寻找最易读的内容,除非您遇到某种效率问题。

话虽如此,我会用另一种方式来做到这一点:

    if(Arrays.asList("fred", "bob", "jack").contains(name)){

    }

【讨论】:

    【解决方案3】:

    你可以...

    使用 switch 语句...

    switch (name) {
        case "fred":
        case "bob":
        case "jack":
            break;
    }
    

    switch (numb) {
        case 4:
        case 45:
        case 91:
            break;
    }
    

    你可以...

    使用某种类型的Collection...

    if (Arrays.asList("fred", "bob", "jack").contains("fred")) {
        // Have match
    }
    

    如果您有动态值,这很有用...

    你也可以使用...

    if (Arrays.asList("fred", "bob", "jack").containsAll(Arrays.asList("fred", "bob", "jack"))) {
        // Have match
    }
    

    如果您需要使用&& 而不是||...

    您还可以用预定义的数组或 List 替换长手 String 列表,这可以让您编写单个方法...

    public <T> boolean matchOR(List<T> want, T have) {
    
        return want.contains(have);
    
    }
    
    public <T> boolean matchAnd(List<T> want, List<T> have) {
    
        return want.containsAll(have);
    
    }
    

    这将允许您编写类似...的东西

    if (matchOr(Arrays.asList("fred", "bob", "jack"), name)) {
        //...
    }
    

    作为一个想法...

    在某些时候,需要考虑上下文,例如,上面的示例允许您提供一系列灵活的条件,但您可能不想这样做,并且必须像您一样编写 if 语句已经

    【讨论】:

    • 如果你有 && 而不是 || 怎么样?
    • 从 Java 7 开始支持打开字符串的答案可能会很有趣。
    • @KickButtowski 那么显然你不能这样做,但这不是 OP 所要求的。
    • @KickButtowski 另外,一个值不能同时是==2==5。跳过那个块。
    • @KickButtowski 嗯?在什么情况下你会有多个包含相同变量的等式?能给个情况吗?j
    猜你喜欢
    • 1970-01-01
    • 2023-03-16
    • 2014-02-07
    • 2012-11-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-11
    相关资源
    最近更新 更多