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

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

例如:

public Response getMethod(

@QueryParam("a") List a,

@QueryParam("b") List b,

@QueryParam("c") List c,

@QueryParam("d") List d,

@QueryParam("e") List 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 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 entry : ourMap.entrySet()) {

int mask = entry.getKey();

if ((mask & inK) == mask) {

// invoke processor

entry.getValue().method();

}

}

真的很简单。

此方法的一些属性:

输入排列的单个实例(例如,存在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&…

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值