В первой статье этой серии вы увидели новый метод в нашем списке, forEach. Но до Java 7 этого метода не существовало ... как это произошло?

Мы знаем, что если бы этот метод был объявлен в интерфейсе, у нас могла бы возникнуть большая проблема!
Что?

Каждому, кто реализовал интерфейс, необходимо его реализовать.
Будет установлен хаос, работа будет огромной, сообщество Java сошло бы с ума.
Интерфейс типа List уничтожит библиотеки, используемые большинством из нас, такие как Hibernate.

Добро пожаловать в ад «NoSuchMethodErrors»!

НО… мы получили новую функцию в Java 8!

Методы по умолчанию

С помощью этой функции мы можем добавить метод к интерфейсу и убедиться, что он реализован во всех реализациях. :)

Например, используемый нами метод forEach объявлен внутри java.lang.Iterable, который является родительским для Collection , в свою очередь, родительский элемент List.

Если мы посмотрим на метод в интерфейсе, то обнаружим:

default void forEach(Consumer <? Super T> action) {
   Objects.requireNonNull (action);
   for (T t: this) {
      action.accept (t);
   }
}

Да, я думаю, вы этого не ожидали, метод с кодом внутри интерфейсов ..

Поскольку ArrayList реализует List, который является (косвенным) дочерним элементом Iterable,
ArrayList имеет этот метод, хочет он того или нет. По этой причине мы можем это сделать:

books.forEach(b -> System.out.println(b.getName()));

Это чтение служит объяснением первой статьи, в которой использовалась эта новая функция.

До свидания, до встречи!

Ссылки:
https://docs.oracle.com/javase/tutorial/java/IandI/defaultmethods.html