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

Метод "Хороший" для вызова метода для каждого объекта с использованием Stream API

Можно ли запустить метод у потребителя, как ссылку на метод, но на объект, переданный потребителю:

Arrays.stream(log.getHandlers()).forEach(h -> h.close());

будет выглядеть как:

Arrays.stream(log.getHandlers()).forEach(this::close);

но это не работает...

есть ли возможность с ссылками на методы или X → X.method() единственный способ работы здесь?

4b9b3361

Ответ 1

Вам не нужно this. YourClassName::close вызовет метод close объекта, переданного потребителю:

Arrays.stream(log.getHandlers()).forEach(YourClassName::close);

Существует четыре типа ссылок на методы (Источник):

Kind                                                                         Example
----                                                                         -------
Reference to a static method                                                 ContainingClass::staticMethodName
Reference to an instance method of a particular object                       containingObject::instanceMethodName
Reference to an instance method of an arbitrary object of a particular type  ContainingType::methodName
Reference to a constructor                                                   ClassName::new

В вашем случае вам нужен третий вид.

Ответ 2

Я полагаю, что это должно быть:

Arrays.stream(log.getHandlers()).forEach(Handler::close);

Если log.getHandlers() возвращает массив объектов типа Handler.

Ответ 3

Конечно, но вы должны использовать правильный синтаксис ссылка метода, т.е. передать класс, к которому принадлежит метод close():

Arrays.stream(log.getHandlers()).forEach(Handler::close);