Делать больше с меньшими затратами: лямбда-выражения в Java 8
Использование лямбда-выражений может сделать ваш Java-код более удобным для чтения, более надежным и читабельным.
Одним из критических замечаний к языку программирования является количество инструкций, написанных для выполнения определенной обработки, и иногда вам приходится писать много кода. Лямбда-выражения решили эту проблему в нескольких случаях и сделали Java сильнее и проще, как это было в C# в течение многих лет.
Лямбда-выражения появились в Java SE 8 и являются наиболее заметными функциями, добавленными в этом выпуске. Лямбда-выражения обеспечивают более четкий способ представления методов и интерфейсов, использующих эти выражения. Лямбда-выражения также улучшают коллекции объектов Java, упрощая просмотр списков, фильтрацию и извлечение данных из коллекций. Функции производительности усиливают Java в многозадачных средах, доступных на всех новых современных компьютерах.
Программисты опасаются, что лямбда-выражения загрязнят объектно-ориентированную природу Java концепцией функционального программирования. По сути, это та же критика, которая затронула язык C# несколько лет назад, но он стал лучше, чем раньше.
LINQ — это набор функций, также появившихся в Visual Studio 2008, которые позволили добавить возможность создавать запросы. LINQ полезен для запросов к базе данных SQL, XML-документам, наборам данных ADO.Net и коллекциям, файлам, строкам и т. д. .Net.
LINQ и лямбда-выражения стали популярными в сообществе C#. Так что вполне возможно, что так будет и с сообществом Java.
Интерфейсы, которые определяют только один метод, в java 8 называются функциональными интерфейсами. Лямбда-выражения часто используются с функциональными интерфейсами и внутренними классами.
Рассмотрим эти три лямбда-выражения:
Одним из критических замечаний к языку программирования является количество инструкций, написанных для выполнения определенной обработки, и иногда вам приходится писать много кода. Лямбда-выражения решили эту проблему в нескольких случаях и сделали Java сильнее и проще, как это было в C# в течение многих лет.
Лямбда-выражения появились в Java SE 8 и являются наиболее заметными функциями, добавленными в этом выпуске. Лямбда-выражения обеспечивают более четкий способ представления методов и интерфейсов, использующих эти выражения. Лямбда-выражения также улучшают коллекции объектов Java, упрощая просмотр списков, фильтрацию и извлечение данных из коллекций. Функции производительности усиливают Java в многозадачных средах, доступных на всех новых современных компьютерах.
Программисты опасаются, что лямбда-выражения загрязнят объектно-ориентированную природу Java концепцией функционального программирования. По сути, это та же критика, которая затронула язык C# несколько лет назад, но он стал лучше, чем раньше.
Лямбда-выражения и выражения LINQ в C# и VisualBasic.Net
Лямбда-выражения были добавлены в C# и VB.Net, в первую очередь для поддержки LINQ (Language-Integrated Query). Лямбда-выражения — это анонимные функции, которые можно использовать для создания древовидных выражений. В C# можно создать лямбда-выражение, указав входные параметры в поле Сторона слева от лямбда-оператора => и поместите выражение или блок инструкций на другую сторону. Например, выражение x=> x*x задает параметр с именем x и возвращает квадрат x. В VB.Net. В этом случае вы используете анонимные функции для создания lambda.LINQ — это набор функций, также появившихся в Visual Studio 2008, которые позволили добавить возможность создавать запросы. LINQ полезен для запросов к базе данных SQL, XML-документам, наборам данных ADO.Net и коллекциям, файлам, строкам и т. д. .Net.
LINQ и лямбда-выражения стали популярными в сообществе C#. Так что вполне возможно, что так будет и с сообществом Java.
Анонимные внутренние классы в Java
Анонимные внутренние классы в Java были первым шагом на пути к лямбда-выражениям. Вы можете использовать их, вызвав внутренний класс, как показано в следующем примере:JButton button = new JButton("test");Внутренний класс ActionListener К кнопке добавлен внутренний класс, содержащий метод actionPerformed() в нем. Это экономит нам немного кода, но не слишком много.
button.addActionListener(new ActionListener(){
@Override public void actionPerformance(ActionEvent e){
System.out.println("один клик");
}
});
Интерфейсы, которые определяют только один метод, в java 8 называются функциональными интерфейсами. Лямбда-выражения часто используются с функциональными интерфейсами и внутренними классами.
Синтаксис лямбда-выражения в Java
Оператор лямбда-выражения в Java -> . Как и C#, Java 8 присоединяет аргументы, как показано в следующем примере:(int x) -> x * xМы объявили переменную x целочисленного типа и мы хотим вернуть квадрат этой переменной x.
Рассмотрим эти три лямбда-выражения:
(int x, int y) -> x + yТеперь рассмотрим пример ActionListener previous с лямбдой:
() -> 36
(String s) -> { System.out.println(s); }
JButton button = new JButton("test");Понятно, что этот код меньше по размеру и более читабельный. Мы также замечаем, что внутренний класс ActionListener стал аргументом e.
testButton.addActionListener(e -> System.out.println("один клик"));
Пакет java.util.function
Файл java.util.function был добавлен в Java 8 и содержит пять типов функциональных интерфейсов:- Predicate: Свойство переданного объекта в качестве параметра.
- Consumer: Действие, которое должно быть запущено с переданным объектом в качестве аргумента.
- Function: Отображает один результат Y: Х-> Y
- Provider: содержит экземпляр X
- Унарный оператор: X-> x
- Бинарный оператор (X, X)-> x
Коллекции объектов в Java 8
Лямбда-выражения могут улучшить использование коллекций в Java. В различных версиях в коллекции были добавлены функции, которые очень хорошо сочетаются с лямбда-выражениями, такие как forEach установлен на обоих интерфейсах Iterator и Iterable.
Example:
Мы хотим определить List который содержит список учеников и имеет своим атрибутом возраст студента.
Listand = Student.createShortList();
Теперь мы можем определить предикат, который можно выбрать из List.
PredicateНаконец, мы можем что-то сделать с нашим выделением:list = и -> et.getAge() >= 20;
aClass.doqlqthing(pl, list);Это намного быстрее, чем предыдущие версии Java. Если вы хотите выполнить более сложный процесс, полезно использовать метод forEach():
et.forEach( e -> e.getName() );В заключение, функции, добавленные в язык Java, никоим образом не ослабят его объектно-ориентированную концепцию. Эти особенности сделают язык сильным, богатым и элегантным.
References: