WebTarget in Jersey client is implemented as a immutable object, and any operations to change the state returns a new WebTarget. To add query params to it, which is coming in as
If you want functional approach you need foldLeft(right) or reduce.
foldLeft
is implemented in some libraries, for example Functionaljava and streamEx.
Functionaljava:
<B> B foldLeft(final F<B, F<A, B>> bff, final B z)
WebTarget wt = wtCollection.foldLeft(x -> (y -> x.queryParam(...)), new WebTarget());
StreamEx:
<U> U foldLeft(U seed, BiFunction<U, ? super T, U> accumulator)
UPD stream-reduce
queryMap.entrySet().stream()
.reduce(new WebTarget(), (x, y) -> {
x.queryParam(y.getKey(), y.getValue());
});
You can use the ol' array trick, which is not good for anything more than a proof of concept.
WebTarget[] webTarget = {client.target(this.address.getUrl()).path(path)};
if (queryMap != null){
queryMap.forEach((k, v)->{
webTarget[0] = webTarget[0].queryParam(k, v);
});
}
return webTarget[0];
You could improve it by using an AtomicReference.
AtomicReference<WebTarget> webTarget = new AtomicReference<>(client.target(this.address.getUrl()).path(path));
if (queryMap != null){
queryMap.forEach((k, v)->{
webTarget.updateAndGet(w->w.queryParam(k, v));
});
}
return webTarget.get();