我正在使用Jax-RS编写REST服务客户端。对于请求,我想添加查询参数。 Jax-RS中的相应方法是webTarget.queryParam(name, value)
返回一个新的WebTarget实例(因此webtarget是不可变的)。
此外,我有一个名称/值对流:Stream<Tuple<String,String>> queryParams
,其中元素的数量不同。
现在,我想将结果流作为下一个应用程序的调用目标,将流中的参数重复应用于queryParam()
方法:
展开调用后,它看起来像这样:
WebTarget original = ...
WebTaragt wt1 = original.queryParam(t1.name,t1.value);
WebTaragt wt2 = wt1.queryParam(t2.name,t2.value);
...
WebTarget wtFinal = wtNminus1.queryParam(tN.name,tN.value);
有没有办法将其有效地实现为纯函数?
最佳答案
我还不能发表有关效率的声明,但是,您可能需要研究Stream.reduce
。以下解决方案假定您至少有一个WebTarget
可用于执行还原。而且,我这种解决方案不允许并行化(为此需要一个适当的组合器,而且我不知道WebTarget
的组合方式)。
Stream<Tuple<String, String>> queryParamStream = ...
WebTarget wtFinal = queryParamStream.reduce(original,
(webtarget, tuple) -> webtarget.queryParam(tuple.name, tuple.value),
(webtarget1, webtarget2) -> /* what would be needed to combine those when you use a parallel stream? */ webtarget2);