使用带参数的方法引用
Use method reference with parameter
我刚开始学习 Java 流并遇到了问题。请看下面的例子。这是节点的一部分 class:
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
方法不起作用的原因是您实际上是在尝试绑定 two 参数以将三参数函数转换为一参数功能。没有类似的简单解决方案,因为没有针对三参数消费者的标准功能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 流并遇到了问题。请看下面的例子。这是节点的一部分 class:
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
方法不起作用的原因是您实际上是在尝试绑定 two 参数以将三参数函数转换为一参数功能。没有类似的简单解决方案,因为没有针对三参数消费者的标准功能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));
简单吗?