如何处理大量查询参数的if / else语句(例如过滤器) - java

打算开发Java Web服务,该服务至少应处理10个@QueryParam。也就是说,假设我有10个查询参数,我将以90个if-else语句(我认为,最少)来尝试构造所有可能的编译。

例如:

public Response getMethod(
        @QueryParam("a") List<String> a,
        @QueryParam("b") List<String> b,
        @QueryParam("c") List<String> c,
        @QueryParam("d") List<String> d,
        @QueryParam("e") List<String> e

       // ... etc
){

 if (a != null && b == null && c == null ...)
 {
    // bla bla bla - 1
 } 

 else if (a != null && b != null && c == null ...) 
 {
    // bla bla bla - 2
 }

....

我的问题是如何应对这种情况?即是否有任何快捷方式/模式可以最大限度地减少工作量?

参考方案

总体思路是构建映射功能:输入排列=>结果处理器。

为此,请使用10+个布尔条件(a!= null,b!= null ...)作为位字段来构建10位密钥。

// assume a,b,c,d...j are in scope and null or not-null
int inK = ((((a != null) ? 1 : 0) << 0 |
            ((b != null) ? 1 : 0) << 1 |
             ...
            ((j != null) ? 1 : 0) << 9))

// so now inK is a 10-bit number where each bit represents whether the
// corresponding parameter is present.

接下来...假设构建一个映射,其中单个条目的值是代表任何键的“结果处理器”的对象。假设此对象实现了OutcomeProcessor。

HashMap<Integer,OutcomeProcessor> ourMap;

每个结果处理器值都有一个作为掩码的键值。例如一个钥匙
值0x14表示参数“ c”(4)和“ e”(0x10)必须
出现以调用处理器。

OutcomeProcessor需要访问所需的任何参数,但
接口是通用的,因此可以将参数提供为列表(在这种情况下为列表)或更一般的集合。

因此,要构建ourMap,请假设您知道映射和处理器实现:

// first outcome processor (an instance of `OutcomeProcessor1` needs 'a' and 'c' input parameters
ourMap.put(0x5, new OutcomeProcessor1());

// second outcome processor (needs 'a' and 'd')
ourMap.put(0x9, new OutcomeProcessor2());

// so you'll see that if the input is 'a','c' and 'd' then both processors
// are invoked.

// repeat for all possible outcome processors

接下来将遮罩应用于地图

for (Map.Entry<Integer, OutcomeProcessor> entry : ourMap.entrySet()) {
   int mask = entry.getKey();
   if ((mask & inK) == mask) {
      // invoke processor
      entry.getValue().method(<list of parameters>);
   }
}

真的很简单。

此方法的一些属性:

输入排列的单个实例(例如,存在a&f&h)可以(如果需要)产生多个结果。
可以从多个输入排列中调用单个结果(例如,结果处理器可能需要b&c(0x6),输入是(a,b,c,d)或(b,c,f)-两种输入情况都可以调用此处理器。)
您可能会变得更加复杂,并让OutcomeProcessor返回清除其服务位的结果。并继续循环直到所有参数得到服务。

Java-如何将此字符串转换为日期? - java

我从服务器收到此消息,我不明白T和Z的含义,2012-08-24T09:59:59Z将此字符串转换为Date对象的正确SimpleDateFormat模式是什么? java大神给出的解决方案 这是ISO 8601标准。您可以使用SimpleDateFormat simpleFormat = new SimpleDateFormat("yyyy-MM…

java:继承 - java

有哪些替代继承的方法? java大神给出的解决方案 有效的Java:偏重于继承而不是继承。 (这实际上也来自“四人帮”)。他提出的理由是,如果扩展类未明确设计为继承,则继承会引起很多不正常的副作用。例如,对super.someMethod()的任何调用都可以引导您通过未知代码的意外路径。取而代之的是,持有对本来应该扩展的类的引用,然后委托给它。这是与Eric…

Java:BigInteger,如何通过OutputStream编写它 - java

我想将BigInteger写入文件。做这个的最好方式是什么。当然,我想从输入流中读取(使用程序,而不是人工)。我必须使用ObjectOutputStream还是有更好的方法?目的是使用尽可能少的字节。谢谢马丁 参考方案 Java序列化(ObjectOutputStream / ObjectInputStream)是将对象序列化为八位字节序列的一种通用方法。但…

Java:从类中查找项目名称 - java

仅通过类的实例,如何使用Java反射或类似方法查找项目名称?如果不是,项目名称(我真正想要的是)可以找到程序包名称吗? 参考方案 项目只是IDE使用的简单组织工具,因此项目名称不是类或JVM中包含的信息。要获取软件包,请使用Class#getPackage()。然后,可以调用Package#getName()将包作为您在代码的包声明中看到的String来获取…

JAVA 8具有任何匹配属性的对象的过滤器列表 - java

我的要求是通过匹配任何属性的字符串来过滤对象列表。例如,假设Contact类具有三个属性:街道,城市,电话。我知道java流过滤器是如何工作的,在这里我必须将输入字符串与每个属性进行比较,如下所示:contactList.stream().filter(contact -> contact.getStreet().equals("dubai&…