我想使用switch
语句的原因是替换if
语句,因为if
语句太长,但我怎样才能替换嵌套的if
语句声明为switch
?
算法是这样的:
if(a very long statement are similar,except the string at the middle)
func1(parameters are same as func1,test1);
if(a very long statement are similar,except the string at the middle)
func2(parameter are same as func1,test2);
.
.
.
if(a very long statement are similar,except the string at the middle)
func16(parameter are same as func1,test16);
我做了以下但有错误:
//List initialization...
for (int i = 0; i < list.size(); i++) {
if (statement with list[i] == true) {
switch (list[i]) {
case "test1":
func1(parameter1,test1);
case "test2":
enter code here
func2(parameter1,test2);
case "test3":
func3(parameter1,test3);
.
.
.
case "test16":
func16(parameter1,test16);
}
}
}
我正在使用Java。任何人都可以给我一些建议。非常感谢。
答案 0 :(得分:0)
在这种情况下,我倾向于接受策略模式,并为每个分支创建一个策略。界面看起来像这样:
interface Strategy{
boolean accepts(String value);
void process(String value);
}
你可以使用这样的东西:
List<Strategy> strategies = // initialize your strategies
list.forEach((item) -> {
strategies.stream()
.filter((s) -> s.accepts(item)) // find the appropriate strategy
.findFirst() // if we found it
.ifPresent(strategy -> strategy.process(item)); // apply it
// or use .getOrElseThrow to fail fast if no strategy can be found
});
关于这一点的好处是每个策略都是可单独维护和可测试的。另外:如果你在不同的分支中有类似的代码,你可以使用一个普通的超类。
显然,这可以进行优化。如果您事先知道您期望的字符串,则可以将策略存储在HashMap中。如果你只是有一个模糊的想法,也许TreeMap可以提供帮助。