如何用switch语句替换嵌套的if语句?

时间:2016-07-08 12:10:11

标签: java list if-statement linked-list switch-statement

我想使用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。任何人都可以给我一些建议。非常感谢。

1 个答案:

答案 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可以提供帮助。