将方法引用与参数结合使用

我刚刚开始学习Java流,并遇到了一个问题。请看一下以下示例。这是 Node 类的一部分:

private Map<String, Node> nodes;

public Optional<Node> child(String name) {
    return Optional.<Node>ofNullable(nodes.get(name));
}

private void findChildren(String name, List<Node> result) {
    child(name).ifPresent(result::add);
    nodes.values().stream()
//          .map(Node::findChildren(name, result))
//          .forEach(Node::findChildren(name, result))
            .forEach(node -> node.findChildren(name, result));
}

我的目的是调用#findChildren,其中包含流中每个节点上的名称和结果参数。我试图使用方法引用Node::findChildren,但没有运气。我会很感激其他解决方案,除了与运营商的解决方案。->

是否可以以某种方式将方法引用与参数一起使用?我喜欢流的想法,我只想使代码更具可读性。

实际上,我认为有一个类似的问题 Method引用一个参数,我读过这个参数,但无法弄清楚如何在我的代码中使用bind2方法。这是唯一的解决方案吗?


答案 1

不能将方法引用用于此目的。您必须求助于 lambda 表达式。链接问题的方法不起作用的原因是,您实际上正在尝试绑定个参数以将三 arg 函数转换为 one-arg 函数。没有类似的简单解决方案,因为三参数消费者没有标准功能。bind2interface

它必须看起来像

interface ThreeConsumer<T, U, V> {
    void accept(T t, U u, V v);
}
public static <T, U, V> Consumer<T> bind2and3(
                        ThreeConsumer<? super T, U, V> c, U arg2, V arg3) {
    return (arg1) -> c.accept(arg1, arg2, arg3);
}

然后可以工作。但这真的比简单吗?.forEach(bind2and3(Node::findChildren, name, result));.forEach(node -> node.findChildren(name, result));


答案 2

推荐