Так работает 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
.