Ниже мы продолжаем погружаться в модель функционального программирования Java8
public class test1 {public static void main (string [] args) {list <Integer> list = arrays.aslist (1,2,3,4,5,6,7,8,9,10); list.foreach (новый потребитель <integer> () {@override public void Accept (Integer Integer) {System.out.println (Integer);}}); }}Эта программа проста, сначала инициализируйте набор целочисленных типов, а затем выводит каждый элемент в консоли. Среди них мы заметили метод Foreach, который является недавно добавленным методом по умолчанию в Java 8.
Общественный интерфейс итерабильный <t> {. Анкет пропускать. по умолчанию void foreach (потребитель <? Super T> action) {objects.requirenonnull (action); for (t t: this) {action.accept (t); }}}Это объявлено в итерабильном интерфейсе и изменяется по ключевым словам по умолчанию. Таким образом, любой подтип этого интерфейса может унаследовать реализацию метода Foreach, поэтому интерфейс списка является косвенным поднтерфейсом итерапии, поэтому он также наследует метод по умолчанию. Java8 принимает этот умный способ расширить функции интерфейса и совместим со старой версией.
Далее мы анализируем реализацию Foreach. Во-первых, мы получаем параметр действия потребительского типа, выполняем непустые суждения, а затем пересматриваем все текущие элементы и передаем их методу приема действия для обработки. Так что же, черт возьми, потребитель? Посмотрите на исходный код
@FunctionalInterfacepublic interface Consumer <T> { /*** Выполняет эту операцию в данном аргументе. * * @param t Входной аргумент */ void access (t t); Анкет . Интерфейс, с одним абстрактным методом, изменяется @functionalInterface, типичным функциональным интерфейсом.
Хорошо, теперь мы знаем, что параметр потребительского типа, полученного Foreach, является функциональным интерфейсом. Единственный метод абстрактного приема в интерфейсе получает параметр и не возвращает значение. Из предыдущей статьи мы знаем, что одним из способов создания экземпляров функциональных типов интерфейса является использование выражений Lambda, чтобы вы могли преобразовать верхнюю программу.
public class test1 {public static void main (string [] args) {list <Integer> list = arrays.aslist (1,2,3,4,5,6,7,8,9,10); // Lambda Expression получает параметр без возврата значений. }} Элемент выражения Lambda -> System.out.println (ITEM) получает параметр без возврата значения и соответствует требованиям подписи метода принятия и скомпилируется и передается.
То есть, если для создания экземпляра функционального интерфейса используется экспрессия лямбда, параметры ввода и возврат этого выражения лямбда должны соответствовать сигнатуру метода единственного абстрактного метода на этом функциональном интерфейсе.
Далее программа будет изменена
public class test1 {public static void main (string [] args) {list <Integer> list = arrays.aslist (1,2,3,4,5,6,7,8,9,10); // Справочный список метода. Foreach (System.out :: println); }} Я увидел двух колонков за выходом, но все равно я был в беспорядке. Анкет Анкет Это второй способ создания экземпляра функционального интерфейса: Справочный синтаксис ссылки на метод IS Object :: Имя метода
Аналогичным образом, использование метода эталонного метода для создания экземпляров функциональных интерфейсов также должно соответствовать определению подписи метода. Смотрите исходный код метода Println здесь
public void println (объект x) {string s = string.valueof (x); синхронизированный (это) {print (s); newline (); }} Получить параметр и не возвращать значение и составить его через.
Наконец, давайте посмотрим на последний тип создания функционального интерфейса. Третий метод: Справочник по созданию метода и продолжайте изменять программу.
public class test1 {public static void main (string [] args) {list <Integer> list = arrays.aslist (1,2,3,4,5,6,7,8,9,10); // Справочный список метода конструктора.foreach (test1 :: new); } Test1 (Integer I) {System.out.println (i); }} Синтаксис, на который ссылаются конструктор: name :: new
Мы добавили новый конструктор в Test1, который получает параметр, не возвращает значение и компилируется. (Чтобы показать только использование цитат конструктора)
Основываясь на предыдущей статье, мы можем суммировать три способа создания типов функциональных интерфейсов:
1. Lambda выражение
2. Метод цитата
3. Ссылка на метод конструктора
Примечание. Независимо от того, какой метод подпись метода должна соответствовать абстрактному методу.