gpt4 book ai didi

java-8 - 仅使用 BiFunction 进行归约

转载 作者:行者123 更新时间:2023-12-01 15:05:10 25 4
gpt4 key购买 nike

传统的函数式语言在列表的初始值和累加器方面考虑减少。在 Java 中,事情更复杂,因为它需要 BinaryOperator。

我想知道我们是否有更好的方法来编写这种函数:

public JsonObject growPath(final JsonObject obj) {
// paths is a list of string
return this.paths.stream().reduce(obj, (child, path) -> {
if (!child.containsKey(path) || !(child.get(path) instanceof JsonObject)) {
// We do override anything that is not an object since the path
// specify that it should be an object.
child.put(path, JsonObject.create());
}
return child.getObject(path);
} , (first, last) -> {
return last;
});
}

我想避免使用 BinaryOperator 参数。我应该使用不同于 reduce 的东西吗?

最佳答案

您为这项工作使用了错误的工具。您正在执行修改 obj 的操作,这与缩减完全无关。如果我们忽略修改方面,这个操作是一个左折叠,Streams 不支持(通常)。您只能使用 reduce 来实现它,如果函数是关联的,而您的函数不是。所以你最好在没有 Streams 的情况下实现它:

public JsonObject growPath(JsonObject obj) {
for(String path: this.paths)
obj = (JsonObject)obj.compute(path,
(key,child)->child instanceof JsonObject? child: JsonObject.create());
return obj;
}

关于java-8 - 仅使用 BiFunction 进行归约,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39996334/

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