Вопросы для собеседования по Java (серия) — лямбда-выражения
Чем меньше, тем лучше, когда дело доходит до Java! 💯
Краткий
Отслеживание предыдущий постсегодня мы рассмотрим:
🔸 Что такое lambda expression
?
🔸 Отношения между lambda
а также Functional Interfaces
🔸 Отношения между lambda
а также Streams
🔸 Примеры реализации.
Реализация
🔵 lambda
выражение используется для обеспечения реализации функционального интерфейса.
Основным преимуществом этого является то, что он сокращает объем кода, необходимого для обеспечения реализации.
Давайте посмотрим, как вы можете это сделать! 👀
1️⃣ Во-первых, вам понадобится функциональный интерфейс. Если вы хотите лучше понять, что это такое и как это работает, ознакомьтесь с эта почта!
@FunctionalInterface
public interface Accumulator {
int add(int x, int y);
}
Аккумулятор.java
2️⃣ Реализовать интерфейс.
Посмотрите больше подобных сообщений на new-spike.net! 🚀
Примечание
До Java 8, если вы не хотели иметь отдельный класс, реализующий ваш интерфейс, вы могли сделать это с помощью анонимного класса.
int x = 10;
int y = 15;
// anonymous class
Accumulator accumulator = new Accumulator() {
@Override
public int add(int x, int y) {
return x + y;
}
};
int result = accumulator.add(x, y); // result = 35
Приложение.java
🚀 От Java 8
вперед вы можете реализовать функциональный интерфейс более быстрым и читаемым способом, используя лямбда-выражение.
int x = 15;
int y = 20;
// lambda expression
Accumulator accumulator = (x1, y1) -> x1 + y1; // implementation of the interface method
int result = accumulator.add(x,y); // result = 35
Приложение.java
Еще одно важное различие между lambda
и anonymous class
заключается в том, что для последнего компилятор Java фактически создает отдельный .class
файл так, как это было бы для обычного класса, реализующего интерфейс.
В то время как lambda
выражение рассматривается как простой метод.
Посмотрите больше подобных сообщений на new-spike.net! 🚀
🤝 Вы также обнаружите, что лямбда-выражения работают рука об руку с Streams
.
Вы можете вносить изменения в элементы в потоке, вы можете отфильтровывать некоторые из них и многое другое.
🔹 Приведу пример.
List<Integer> inputList = new ArrayList<>();
inputList.add(1);
inputList.add(2);
inputList.add(3);
inputList.add(4);
inputList.add(5);
List<Integer> filteredList = inputList.stream()
.filter(item -> item % 2 == 0) // lambda expression returning true for odd items
.collect(Collectors.toList());
// filteredList = { 2, 4 }
🔹 Кроме того, лямбда-блок не обязательно должен состоять только из одной строки.
List<Integer> inputList = new ArrayList<>();
inputList.add(1);
inputList.add(2);
inputList.add(3);
inputList.add(4);
inputList.add(5);
inputList.forEach(item -> {
item++;
System.out.println("Updated item: " + item);
});
// Result:
// Updated item2
// Updated item3
// Updated item4
// Updated item5
// Updated item6
Приложение.java
👍 Однако эмпирическое правило заключается в том, что если вам нужно иметь несколько строк в лямбда-выражении, извлекайте его в приватном методе.
public class Calculator {
public static void calculate() {
List<Integer> inputList = new ArrayList<>();
inputList.add(1);
inputList.add(2);
inputList.add(3);
inputList.add(4);
inputList.add(5);
inputList.forEach(item -> extracted(item));
}
private static void extracted(Integer item) {
item++;
System.out.println("Updated item: " + item);
}
}
🧠 Или, что еще лучше, на основе сигнатуры метода компилятор может понять, что вы пытаетесь сделать.
Это означает, что вы можете вызвать метод, просто передав имя класса вместе с именем метода.
public class Calculator {
public static void calculate() {
List<Integer> inputList = new ArrayList<>();
inputList.add(1);
inputList.add(2);
inputList.add(3);
inputList.add(4);
inputList.add(5);
inputList.forEach(Calculator::extracted); // lambda using method reference
}
private static void extracted(Integer item) {
item++;
System.out.println("Updated item: " + item);
}
}
Калькулятор.java
Не пропустите больше таких сообщений! Подпишитесь на нашу бесплатную рассылку!
Посмотрите больше подобных сообщений на new-spike.net! 🚀