java8 + внутренняя обработка каждого цикла - PullRequest
0 голосов
/ 05 мая 2018

Я новичок в java8. Я пытался понять работу цикла foreach в потоках. Мой код выглядит следующим образом: -

Stream<String> s = someist.stream();
Consumer<String> consumer = (String s1)->System.out.println(s1);
s.forEach(consumer);

Вопрос в том, как цикл foreach узнает, что он вызывает customer.accept (T t), когда я просто передаю ссылку на Consumer и не вызываю customer.accept (T t) внутри нее. Хотя, когда мы предоставляем некоторое лямбда-выражение для функционального интерфейса, нам нужно вызывать его абстрактный метод, мы просто не вызываем его здесь. Так как же цикл foreach узнает, что он должен делать со ссылкой на потребителя, предоставленной в качестве параметра?

Ответы [ 3 ]

0 голосов
/ 05 мая 2018

Как гласит документ Java:

void forEach​(Consumer<? super T> action)

Выполняет действие для каждого элемент этого потока.

То есть поведенческий параметр, переданный методу forEach, будет вызываться внутри каждого элемента источника.

0 голосов
/ 06 мая 2018

Так работает Functional Interface. У них есть только один abstract метод. Там могут быть дополнительные default методы. Поведение метода abstract передается в форме lambda expression (передача данных как данных). Это поведение, в свою очередь, тело метода для abstract метода Functional Interface. Методы default вызываются по их именам.

Поэтому, когда вы передаете Functional Interface в качестве параметра метода другому методу, в этом случае Consumer<T> методу forEach() интерфейса java.util.stream.Stream, его абстрактный метод accept(T t) вызывается для каждого элемента поток.

Говоря логически, есть только один метод, который нужно вызывать, если в качестве параметра передается только Functional Interface.

0 голосов
/ 05 мая 2018

Конкретная реализация forEach вызовет accept, например:

public class MyStream implements Stream<String> {

    @Override
    public void forEach(Consumer<? super String> action) {
        while (hasNext()) {
            action.accept(next());
        }
    }

    ...
}
...