Подтвердить что ты не робот

Использовать ссылку на метод с параметром

Я только начал изучать потоки 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 в потоке. Я попытался использовать ссылки метода Node:: findChildren без везения. Я бы оценил решения, другие с оператором ->.

Можно ли как-то использовать ссылку на метод вместе с параметром? Мне нравится идея потоков, и я просто хочу сделать код более удобочитаемым.

На самом деле, я думаю, что есть аналогичный вопрос Ссылки метода с параметром, который я прочитал, но не могу понять, как использовать метод bind2 в моем коде. Это единственное решение?

4b9b3361

Ответ 1

Вы не можете использовать ссылки на методы для этой цели. Вы должны прибегать к лямбда-выражениям. Причина, по которой метод bind2 связанного вопроса не работает, заключается в том, что вы на самом деле пытаетесь связать два параметра для преобразования функции с тремя аргументами в функцию с одним аргументом. Подобного простого решения нет, так как для потребителей с тремя потребителями нет стандартного функционала 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));?