我正在使用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);

08-05 19:31