在java中使用切换大小写的string

if在检查String时遇到switch case则需要更改以下内容以提高圈复杂度。

 String value = some methodx; if ("apple".equals(value)) { method1; } if ("carrot".equals(value)) { method2; } if ("mango".equals(value)) { method3; } if ("orange".equals(value)) { method4; } 

但是我不确定我会得到什么样的价值。

Java(版本7之前)不支持switch / case中的String。 但是你可以通过使用一个枚举来达到预期的效果。

 private enum Fruit { apple, carrot, mango, orange; } String value; // assume input Fruit fruit = Fruit.valueOf(value); // surround with try/catch switch(fruit) { case apple: method1; break; case carrot: method2; break; // etc... } 

学习使用else

因为value永远不会同时等于两个不等价的string,所以只有5个可能的结果 – 每个值你关心的一个,加上一个“以上都不是”。 但是因为你的代码不能消除不能通过的testing,所以它有16个“可能的”path(testing次数的2倍),其中绝大多数是永远不会遵循的。

else ,唯一存在的path是可以实际发生的5个path。

 String value = some methodx; if ("apple".equals(value )) { method1; } else if ("carrot".equals(value )) { method2; } else if ("mango".equals(value )) { method3; } else if ("orance".equals(value )) { method4; } 

或者开始使用JDK 7,其中包括在switch语句中使用string的能力。 当然,Java只是将switch编译成if / else类似的结构。

为了减less圈复杂度,使用一张图:

 Map<String,Callable<Object>> map = new HashMap < > ( ) ; map . put ( "apple" , new Callable<Object> () { public Object call ( method1 ( ) ; return null ; } ) ; ... map . get ( x ) . call ( ) ; 

或多态性

现在每个人都在使用至lessJava 7 ,对吧? 这是原始问题的答案:

 String myString = getFruitString(); switch (myString) { case "apple": method1(); break; case "carrot": method2(); break; case "mango": method3(); break; case "orange": method4(); break; } 

笔记

  • case语句相当于使用String.equals
  • 像往常一样,string匹配区分大小写。
  • 根据文档 ,这通常比使用链式ifelse语句更快(如在cHao的答案中 )。

只要做出具体的emory的答案,可执行代码如下:

  Map<String,Callable<USer>> map = new HashMap<String,Callable<User>>(); map.put( "test" , new Callable<User> () { public User call (){ return fillUser("test" ); }} ) ; map.put( "admin" , new Callable<Utente> () { public Utente call (){ return fillUser("admin" ); }} ) ; 

用户是POJO,然后

  User user = map.get(USERNAME).call(); 

最后被调用的方法是某处:

  private User fillUser(String x){ User user = new User(); // set something in User return user; } 

Java不支持使用String的Switch-case。 我想这个链接可以帮助你。 🙂

这是一个可能的1.7以前的方式,我不能推荐:

 public class PoorSwitch { final static public int poorHash (String s) { long l = 0L; for (char c: s.toCharArray ()) { l = 97*l + c; } return (int) l; } public static void main (String args[]) { String param = "foo"; if (args.length == 1) { param = args[0]; } // uncomment these lines, to evaluate your hash // test ("foo"); // test ("bar"); switch (poorHash (param)) { // this doesn't work, since you need a literal constant // so we have to evaluate our hash beforehand: // case poorHash ("foo"): { case 970596: { System.out.println ("Foo!"); break; } // case poorHash ("bar"): { case 931605: { System.out.println ("Bar!"); break; } default: { System.out.println ("unknown\t" + param); break; } } } public static void test (String s) { System.out.println ("Hash:\t " + s + " =\t" + poorHash (s)); } } 

也许你可以在生成的代码中使用这样的技巧。 否则我不能推荐它。 与其说哈希碰撞的可能性让我担心,不过如果有什么东西混在一起(剪切粘贴),很难find错误。 931605不是一个很好的文档。

把它看作概念的certificate,好奇。

我们可以将开关只应用于数据types兼容的int:short,Shor,byte,Byte,int,Integer,char,Character或枚举types。

使用switch语句评估Stringvariables已经在Java SE 7中实现 ,因此它只能在Java 7中使用。您还可以看看在JDK 7中如何实现这个新function 。

不是很漂亮,但这是另一种方式:

 String runFct = queryType.equals("eq") ? "method1": queryType.equals("L_L")? "method2": queryType.equals("L_R")? "method3": queryType.equals("L_LR")? "method4": "method5"; Method m = this.getClass().getMethod(runFct); m.invoke(this); 
 String value = someMethod(); switch(0) { default: if ("apple".equals(value)) { method1(); break; } if ("carrot".equals(value)) { method2(); break; } if ("mango".equals(value)) { method3(); break; } if ("orance".equals(value)) { method4(); break; } }