Говоря о Java 8, первое, что приходит на ум, — это лямбда (замыкание) и метод виртуального расширения (метод по умолчанию). Эта функция уже давно рекламируется крупными технологическими веб-сайтами, и это также первая функция, о которой мы поговорим на конференции. В начале нашей серии статей по Java 8 (JEP126 http://openjdk.java.net/jeps/126) некоторые библиотеки jdk8 были переработаны с использованием лямбда-выражений. Понимание этого имеет большое значение для изучения новых функций Java 8.
1. Функциональный интерфейс
Функциональный интерфейс (функциональный интерфейс также называют функциональным интерфейсом, но на самом деле это одно и то же). Проще говоря, функциональный интерфейс — это интерфейс, содержащий только один метод. Например, java.lang.Runnable и java.util.Comparator в стандартной библиотеке Java являются типичными функциональными интерфейсами. Java 8 предоставляет @FunctionalInterface в качестве аннотации. Эта аннотация не обязательна, если интерфейс соответствует стандартам функциональных интерфейсов (то есть интерфейс, содержащий только один метод), виртуальная машина определит его автоматически. лучше всего использовать аннотацию @FunctionalInterface в интерфейсе для его объявления. Это предотвратит ошибочное добавление новых методов в интерфейс другими членами команды.
Лямбда-выражение в Java не может существовать отдельно. Для его хранения требуется функциональный интерфейс. Тело метода лямбда-выражения на самом деле является реализацией функционального интерфейса. Синтаксис будет обсуждаться ниже.
2. Лямбда-синтаксис
Содержит три части
1. Формальный параметр, разделенный запятыми в круглых скобках. Параметр — это параметр метода в функциональном интерфейсе.
2. Символ стрелки: ->
3. Тело метода может быть выражением или блоком кода. Тело метода — это реализация метода в функциональном интерфейсе. Если это блок кода, он должен быть заключен в {} и требуется возвращаемое значение. существует исключение. If Если возвращаемое значение метода в функциональном интерфейсе недействительно, {} не требуется.
В целом это выглядит так:
Скопируйте код кода следующим образом:
(параметры) -> выражение или (параметры) -> { операторы };
Посмотрите полный пример для легкого понимания
Скопируйте код кода следующим образом:
/**
* Тестирование лямбда-выражения
*
* @автор Бенхаил
*/
публичный класс TestLambda {
public static void runThreadUseLambda() {
//Runnable — это функциональный интерфейс, который содержит только метод запуска без параметров, возвращающий void;
//Таким образом, в левой части лямбда-выражения нет параметров, а в правой части нет возврата. Он просто печатает предложение.
new Thread(() ->System.out.println("поток, реализованный с помощью лямбды")).start();
}
public static void runThreadUseInnerClass() {
//Я не буду много говорить об этом методе. Это был распространенный подход в старых версиях.
новый поток (новый Runnable () {
@Override
общественный недействительный запуск () {
System.out.println("Поток реализован внутренним классом");
}
}).начинать();
}
public static void main(String[] args) {
TestLambda.runThreadUseLambda();
TestLambda.runThreadUseInnerClass();
}
}
Видно, что код, созданный с использованием лямбда-выражений, будет более кратким и читабельным.
3. Справочник по методу
Фактически, это упрощенный способ написания лямбда-выражения. Указанный метод на самом деле является реализацией тела метода лямбда-выражения. Левая часть — это контейнер (может быть именем класса или имени экземпляра). в середине — «::», а в правой части — соответствующее имя метода. Как показано ниже:
Скопируйте код следующим образом: ObjectReference::methodName.
Общий формат цитирования метода:
Если это статический метод, это ClassName::methodName. Например, Object::equals
Если это метод экземпляра, это Instance::methodName. Например, Object obj=new Object();obj::equals;
Конструктор. ИмяКласса::new.
Давайте рассмотрим полный пример для облегчения понимания:
Скопируйте код кода следующим образом:
импортировать java.awt.FlowLayout;
импортировать java.awt.event.ActionEvent;
импортировать javax.swing.JButton;
импортировать javax.swing.JFrame;
/**
*
* @автор Бенхаил
*/
общественный класс TestMethodReference {
public static void main(String[] args) {
Рамка JFrame = новый JFrame();
Frame.setLayout(новый FlowLayout());
Frame.setVisible(истина);
JButton button1 = new JButton("Нажмите на меня!");
JButton button2 = new JButton("Нажми и на меня!");
Frame.getContentPane().add(button1);
Frame.getContentPane().add(button2);
//Параметром метода addActionListener здесь является ActionListener, который является функциональным интерфейсом.
//Используем метод лямбда-выражения
button1.addActionListener(e -> { System.out.println("Вот реализация Lambda"); });
//Используем метод ссылки на метод
button2.addActionListener(TestMethodReference::doSomething);
}
/**
* Вот метод реализации функционального интерфейса ActionListener
* @парам е
*/
public static void doSomething(ActionEvent e) {
System.out.println("Вот эталонная реализация метода");
}
}
Видно, что метод doSomething является реализацией лямбда-выражения. Преимущество этого метода в том, что если вы чувствуете, что лямбда-метод очень длинный и влияет на читаемость кода, ссылка на метод является решением.
4. Резюме
Выше приведено все содержание синтаксиса лямбда-выражений. Я считаю, что у каждого есть определенное понимание лямбда-выражений. Однако, если код прост, он не впечатлит многих зрителей. необходимо ввести лямбду в Java 8, потому что лямбда Выражения могут упростить многопоточную или многоядерную обработку данных в коллекции и обеспечить более высокую скорость обработки коллекции. Эта функция JEP126 будет разделена на три части. Причина разделения связана с этой функцией. . Слишком много вещей, которые нужно написать. Эта часть знакомит читателей с синтаксисом и концепциями лямбда-выражений и ссылок на методы. Вторая часть посвящена содержанию виртуальных методов расширения (методов по умолчанию). большие коллекции данных и решения. Раскройте возможности лямбда-выражений. Следите за обновлениями. . . .