Делать больше с меньшими затратами: лямбда-выражения в Java 8

Использование лямбда-выражений может сделать ваш Java-код более удобным для чтения, более надежным и читабельным.

Одним из критических замечаний к языку программирования является количество инструкций, написанных для выполнения определенной обработки, и иногда вам приходится писать много кода. Лямбда-выражения решили эту проблему в нескольких случаях и сделали 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"); 
button.addActionListener(new ActionListener(){
@Override public void actionPerformance(ActionEvent e){
System.out.println("один клик");
}
});
Внутренний класс ActionListener  К кнопке добавлен внутренний класс, содержащий метод actionPerformed() в нем. Это экономит нам немного кода, но не слишком много.

Интерфейсы, которые определяют только один метод, в java 8 называются функциональными интерфейсами. Лямбда-выражения часто используются с функциональными интерфейсами и внутренними классами.

Синтаксис лямбда-выражения в Java

Оператор лямбда-выражения в Java -> . Как и C#, Java 8 присоединяет аргументы, как показано в следующем примере:

(int x) -> x * x
Мы объявили переменную x целочисленного типа и мы хотим вернуть квадрат этой переменной x.

Рассмотрим эти три лямбда-выражения:

(int x, int y) -> x + y 

() -> 36

(String s) -> { System.out.println(s); }
Теперь рассмотрим пример ActionListener previous с лямбдой:

JButton button = new JButton("test"); 
testButton.addActionListener(e -> System.out.println("один клик"));
Понятно, что этот код меньше по размеру и более читабельный. Мы также замечаем, что внутренний класс ActionListener стал аргументом e.

Пакет 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 который содержит список учеников и имеет своим атрибутом возраст студента.

List and = Student.createShortList(); 
Теперь мы можем определить предикат, который можно выбрать из List.

Predicate list = и -> et.getAge() >= 20; 
Наконец, мы можем что-то сделать с нашим выделением:

aClass.doqlqthing(pl, list); 
Это намного быстрее, чем предыдущие версии Java. Если вы хотите выполнить более сложный процесс, полезно использовать метод forEach():

et.forEach( e -> e.getName() ); 
В заключение, функции, добавленные в язык Java, никоим образом не ослабят его объектно-ориентированную концепцию. Эти особенности сделают язык сильным, богатым и элегантным.

References: