Closing over immutable variable and accumulate values across multiple iterations as a lambda expression - Java 8

前端 未结 2 2060
长情又很酷
长情又很酷 2021-01-24 09:56

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

相关标签:
2条回答
  • 2021-01-24 10:37

    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()); 
        });
    
    0 讨论(0)
  • 2021-01-24 10:49

    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();
    
    0 讨论(0)
提交回复
热议问题