在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匹配区分大小写。
- 根据文档 ,这通常比使用链式
if
–else
语句更快(如在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语句评估String
variables已经在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; } }