将流中的参数重复应用到流畅的构建器方法

Repeated application of parameters from a stream to a fluent builder method

我正在使用 Jax-RS 编写 REST 服务客户端。对于请求,我想添加查询参数。 Jax-RS 中相应的方法是 webTarget.queryParam(name, value) 返回一个 new 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 可用于执行归约。此外,我这个解决方案不允许并行化(为此需要一个合适的组合器,我不知道 WebTargets 需要如何组合)。

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);