【发布时间】:2015-07-02 08:14:16
【问题描述】:
我刚开始学习 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 的参数)
-
forEach() 需要单个 Node 参数并返回 void,因此只能在此处传递接受单个 Node 的静态方法的引用,或者返回 void 的 Node 类的无参数方法。解决方法:自己创建这样的方法。
-
marcin-chwedczuk.github.io/method-references-in-java-8 是人们研究带参数的方法引用的一些很好的例子。
标签: java lambda java-stream method-reference functional-interface