传统的函数式语言在列表中考虑初始值和累加器的减少。在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不同的东西吗?
答案 0 :(得分:1)
您使用错误的工具进行工作。您正在执行修改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;
}