gpt4 book ai didi

java - 关闭不可变变量并在多次迭代中累积值作为 lambda 表达式 - Java 8

转载 作者:行者123 更新时间:2023-11-29 04:40:56 26 4
gpt4 key购买 nike

Jersey 客户端中的 WebTarget 是作为一个不可变对象(immutable对象)实现的,任何改变状态的操作都会返回一个新的 WebTarget。向其添加查询参数,它以 Map<> 的形式出现编写了以下代码。

public WebTarget webTarget(String path, Map<String, String> queryMap) {

WebTarget webTarget = client.target(this.address.getUrl()).path(path);
if (queryMap != null)
queryMap.entrySet().forEach(e -> webTarget.queryParam(e.getKey(), e.getValue()));
return webTarget;
}

这里的问题是每次调用 .queryParam()返回一个新的 WebTarget 并且我坚持如何累积,因为在 lambda 表达式中使用的变量必须是最终的或隐式最终的,没有任何重新分配。

编辑:在这种情况下,减少可能不是一个选项,因为 WebTarget 缺乏减少机制,我无法从一个 webtarget 获取 queryParam 并将其设置到另一个。如果 WebTarget api 对累积有更好的支持,就可以使用它。

二手 Jool尝试利用原生 Java 8 API 中缺少的 foldLeft,但由于 WebTarget api 缺乏对它的支持,它仍然触底。

EDIT2:foldLeft 是下面答案中建议的方式,确实写了一个小 blog对此

最佳答案

如果你想要函数式方法,你需要 foldLeft(right) 或 reduce。

foldLeft 在一些库中实现,例如 FunctionaljavastreamEx .

函数式java:

<B> B foldLeft(final F<B, F<A, B>> bff, final B z)

WebTarget wt = wtCollection.foldLeft(x -> (y -> x.queryParam(...)), new WebTarget());

流媒体:

<U> U foldLeft(U seed, BiFunction<U, ? super T, U> accumulator) 

UPD流减少

queryMap.entrySet().stream()
.reduce(new WebTarget(), (x, y) -> {
x.queryParam(y.getKey(), y.getValue());
});

关于java - 关闭不可变变量并在多次迭代中累积值作为 lambda 表达式 - Java 8,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39226863/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com