一次测试多个.equals()

时间:2012-01-31 05:33:53

标签: java equals

我想知道是否有办法缩短带有“.equals”的if语句,以便我可以在一行中测试,而不是多个if语句。

这是我当前漫长的代码的摘录。 (这是我想缩短的)

if (queryArray[1].equals("+")) { 
     System.out.println("Got +");
 } else if (queryArray[1].equals("-")) {
     System.out.println("Got -");
 } else if (queryArray[1].equals("*")) {
     System.out.println("Got *");
 }

我尝试这样做(不起作用)以减少所需的行数。

if (queryArray[1].equals("+","-","*")) { 
             System.out.println("Got +");
         }

甚至(不起作用):

if (queryArray[1].equals("+" || "-" || "*")) { 
         System.out.println("Got +");
     }

此外,我知道||中的语法“if statements”,但我希望在“.equals()”方法中缩短它。

有没有办法缩短这段代码?谢谢。

9 个答案:

答案 0 :(得分:5)

由于您只进行单字符比较,因此可以在switch上执行queryArray[1].charAt(0)

switch (queryArray[1].charAt(0)) {
    case '+':
      // plus thing
      break;
    case '-':
      // minus thing
      break
    // ... and so on
}

或者,如果您使用的是Java 7,则可以直接切换字符串。

答案 1 :(得分:2)

首先,.equals()中的替代语法不是有效的Java。

除非你有多个测试,并且每个测试中的每个测试都有很多cyclomatic complexity,所以没有任何令人信服的理由去做你想要的。

那就是说,你需要解决问题,并采取以下措施:

interface Handler { public void handle(); }

final Map<String, Handler> symbols = new HashMap<String, Handler>();
symbols.put("+", new Handler() {
    public void handle() { System.out.println("Got +"); }
};   
symbols.put("-", new Handler() {
    public void handle() { System.out.println("Got -"); }
};
symbols.put("*", new Handler() {
    public void handle() { System.out.println("Got *"); }
}; 

然后逻辑测试减少到:

symbols.get(queryArray[1]).handle();

这不会比单个if/elseif/else构造更快,但它会像您正在寻找减少代码行的那样。

这是一种常见的面向对象设计模式,它是Chain of Responsibility Pattern的变体。

if/elseif/else构造中有许多替代方案且每个替代方案中的逻辑很复杂时,它非常有用。

它使添加替代方案变得简单,因为它实现了接口并添加了Map的替代方案。

它也使维护变得非常容易。因为它促进了规则的封装和逻辑的凝聚力。在非常大的if/elseif/else块中完全丢失的东西。

您不必像我的示例那样使用Anonymous Inner Classes,它们可以是属于自己的文件或常规内部类的常规类。

答案 2 :(得分:2)

使用Java 7,您可以对字符串执行switch

switch(queryArray[1]) {
  case "+":
  case "*":
  case "-":
     System.out.println("Got " + queryArray[1]);
     break;
  default:
     // do nothing
}

答案 3 :(得分:2)

你甚至可以这样做

List<String> list = Arrays.asList("+","-","*");

if(list.contains(queryArray[1]))
  System.out.println("Got "+queryArray[1]);

答案 4 :(得分:1)

试试这个

Map<String,String> resultMap = new HashMap<String,String>();
resultMap.put("+","Got +");
resultMap.put("-","Got -");
resultMap.put("*","Got *");

System.out.println(resultMap.get(queryArray[1]));

答案 5 :(得分:0)

您提供的代码块最有效,更易读。如果考虑到scalabilty和维护,如果逻辑没有改变,它就不应该重构。

if (queryArray[1].equals("+")) 
{       
    System.out.println("Got +");  
} 
else if (queryArray[1].equals("-")) 
{      
    System.out.println("Got -");  
}
else if (queryArray[1].equals("*")) 
{
    System.out.println("Got *");  
}

然而 Borealid 已经给出了switch-case构造,但是一点点逻辑更改将启动很多更改,并且可能还有bug爬行。

嗯,我也提供同样的解决方案,但它也不比你提供的代码好:

System.out.println(queryArray[1].equals("+")?"Got +"
                  :queryArray[1].equals("-")?"Got -"
                  :queryArray[1].equals("*")?"Got *"
                  :"");

如果您的问题是方法大小正在增加,请尝试创建一个单独的方法,该方法返回一个字符串(要打印),因此可以将equals-comparison方法移动到单独的块中。

还有一点要说的是,||&&运算符应与boolean个操作数一起使用。并且,在调用API之前检查它是javadoc:equals

答案 6 :(得分:0)

我能想到的最短的Java解决方案是:

System.out.println (Arrays.asList ("+", "-", "*").contains ("-"));

答案 7 :(得分:0)

单行...

if (Arrays.asList("+", "-", "*").contains(queryArray[1])) {
    System.out.println("BINGO!");
}

这是有效的,因为asList有一个varargs参数。

但是,此代码涉及创建和初始化新的String[],将其包装在新的List中,然后迭代列表。如果性能可能是一个问题,那就不要这样做。

答案 8 :(得分:0)

更加模糊的东西:

char a = queryArray[1].charAt(0);
if ((a - '*') * (a - '+') * (a - '-') == 0) {
    /* process here. */
}

如果你想比较多个角色,那就没用了。