如何避免使用多个Switch案例语句

时间:2020-11-05 06:07:44

标签: java spring java-8 switch-statement

我需要重构一个基于接收到的queryString值使用多个case语句的代码。每次添加新查询时,我们都必须添加新的case语句。我们可以尝试简化它并使其更通用,以便我们不必继续添加新的case语句吗?下面是代码片段

      switch (queryRequestRecevied) {
        case query1:
            reply = processQuery1();
            break;

        case query2:
            reply = processQuery2();
            break;

        case query3:
            reply = processQuery3();
            break;

        case query4:
            reply = processQuery4();
            break;

        case query5:
            reply = processQuery5();
            break;

        case query6:
            reply = processQuery6();
            break;

        default:
            reply = processInvalidQuery();
            break;
      }

2 个答案:

答案 0 :(得分:2)

您要查找的操作的名称是用多态替换条件:与其使用switchif语句,不如使用{@ 1}}或Supplier语句,调用它。我在这里假设您的查询返回一些值,并使用Map<String, Supplier<QueryResult>> queryProcessors = new HashMap<>(); ... // in a constructor or similar place queryProcessors.put(query1, this::processQuery1); queryProcessors.put(query2, this::processQuery2); // in your handler method var result = queryProcessors.getOrDefault(query, this::processInvalidQuery).get(); ;如果没有,请使用其他功能界面或创建自己的界面。

// declare some Spring beans implementing this interface
interface QueryProcessor {
  String getQuery();
  QueryResult processQuery();
}

// in your service class
Map<String, QueryProcessor> queryProcessors;

@Autowired //(not necessary for a single constructor)
MyService(Collection<QueryProcessor> queryProcessors) {
  this.queryProcessors = queryProcessors.stream()
    .collect(toMap(QueryProcessor::getQuery, identity()));
}

要进一步解耦,可以执行以下操作:

a = "ccdd"

b = "ccddcc"


def f(a, b):
    myList = list(set(a) & set(b))
    status = True
    while status == True:
        status = False
        if len(myList) > 0:
            status = True
            index1 = a.find(myList[0])
            index2 = b.find(myList[0])
            a = a[:index1] + a[index1 + 1:]
            b = b[:index2] + b[index2 + 1:]
            myList = list(set(a) & set(b))
    return a, b


a, b = f(a, b)

print(a)
print(b)

答案 1 :(得分:0)

您没有提供足够的代码来查看可以分解的内容/更通用的内容。

但是至少可以代替测试输入查询,而可以在@Controller中为每个查询声明1个终结点,然后无需进行切换/案例测试。