首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >使用带参数的方法引用

使用带参数的方法引用
EN

Stack Overflow用户
提问于 2015-04-24 06:20:22
回答 1查看 53.9K关注 0票数 45

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

代码语言:javascript
复制
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));
}

我的意图是在流中的每个节点上使用name和result参数调用#findChildren。我尝试使用引用Node::findChildren的方法,但没有成功。我很欣赏其他的解决方案,那就是使用->运算符。

有没有可能将方法引用与参数一起使用?我喜欢streams的想法,我只是想让代码更具可读性。

实际上,我认为有一个类似的问题Method references with a parameter,我读到了,但不知道如何在我的代码中使用bind2方法。这是唯一的解决方案吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-04-24 18:24:49

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

它必须看起来像是

代码语言:javascript
复制
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));更简单吗

票数 44
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29835382

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档