Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/ant/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 从流到fluent builder方法的参数重复应用_Java_Functional Programming_Jax Rs_Java Stream_Purely Functional - Fatal编程技术网

Java 从流到fluent builder方法的参数重复应用

Java 从流到fluent builder方法的参数重复应用,java,functional-programming,jax-rs,java-stream,purely-functional,Java,Functional Programming,Jax Rs,Java Stream,Purely Functional,我正在使用Jax-RS编写一个REST服务客户机。对于一个请求,我想添加查询参数。Jax-RS中相应的方法是webTarget.queryParam(名称、值)返回一个新的webTarget实例(因此webTarget是不可变的) 此外,我还有一个名称-值对流:streamqueryparams,元素数量不同 现在,我想重复将流中的参数应用于queryParam()方法,将结果作为下一个应用程序的调用目标: 随着调用的展开,它将如下所示: WebTarget original = ... Web

我正在使用Jax-RS编写一个REST服务客户机。对于一个请求,我想添加查询参数。Jax-RS中相应的方法是
webTarget.queryParam(名称、值)
返回一个新的webTarget实例(因此webTarget是不可变的)

此外,我还有一个名称-值对流:
streamqueryparams
,元素数量不同

现在,我想重复将流中的参数应用于
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);

是否有一种方法可以将其作为纯功能有效地实现?

我还不能对效率进行说明,但是,您可能需要研究一下。下面的解决方案假设您至少有一个
WebTarget
,您可以使用它来执行缩减。此外,我认为该解决方案不允许并行化(因此需要一个合适的组合器,我不知道如何组合
WebTarget
s)

流查询参数流=。。。
WebTarget wtFinal=queryParamStream.reduce(原始,
(webtarget,tuple)->webtarget.queryParam(tuple.name,tuple.value),
(webtarget1、webtarget2)->/*当您使用并行流时,需要什么来组合它们?*/webtarget2);

在10K+范围内,数据流的开销开始收支平衡。在一种情况下,rest请求似乎是一种过度使用
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);