java - 使用带有参数的方法引用

标签 java lambda java-stream method-reference functional-interface

我刚刚开始学习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 references with a parameter我读过但无法弄清楚如何在我的代码中使用 bind2 方法。这是唯一的解决方案吗?

最佳答案

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

它必须看起来像

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)); 更简单吗?

关于java - 使用带有参数的方法引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48433319/

相关文章:

java - SchedulerFactory 是否能够在启动时为 quartz 创建表?

java - 将相对值应用于数组

具有只有一种方法的抽象类的 Java 8 lambda 表达式

java - 如何在 Java 8 流 api 中实现不变性

java - 无法从 Java 解密 iOS(Swift) 中的 (AES)

java - 如何从类路径中的 Java 包中读取所有类?

java - 如何使用 Java 的 lambda 表达式来打印数组?

c++ - 将可变函数参数转发到 std::function 对象

java - 为什么 Files.list() 并行流的执行速度比使用 Collection.parallelStream() 慢得多?

java - 使用java中的递归字段转换对象并包装到另一个对象