仅使用BiFunction减少

时间:2016-10-12 10:28:54

标签: java-8 reduce

传统的函数式语言在列表中考虑初始值和累加器的减少。在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不同的东西吗?

1 个答案:

答案 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;
}