我想知道是否有办法缩短带有“.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()
”方法中缩短它。
有没有办法缩短这段代码?谢谢。
答案 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. */
}
如果你想比较多个角色,那就没用了。