На данный вопрос уже ответили:
Что такое лямбда-выражение и где оно применяется?
Лямбда-выражения - это новая особенность Java 8 (как и ссылки на методы), которая позволяет реализовать частичный функциональный сахар, если так можно выразиться. Другими словами, лямбды позволяют немного оторваться от стандартной парадигмы в Java - ООП, и добавить в язык немного функциональности, сделать его более гибким.
Собственно, лямбда-выражения созданы в первую очередь, чтобы упростить написание кода. А сами по себе - они очень схожи с анонимными классами.
Думаю, проще будет понять по примеру. Допустим, Вы хотите создать и запустить новый поток. Вы можете сделать это несколькими способами:
Первое:
class RunnableImpl implements Runnable {
@Override
public void run() {
System.out.println("Hello world from new thread");
}
}
...
...
Thread thread = new Thread(new RunnableImpl()); // Обычное использование объекта класса
Второе:
Thread thread = new Thread(new Runnable() {
@Override
public void run() {
// Анонимный класс упрощает код и добавляет функциональность
System.out.println("Hello world from new thread");
}
});
Третье:
Thread thread = new Thread(() -> System.out.println("Hello world from new thread via lambda")); // Как видим, тут очень всё просто
Затем, для каждого из данных примеров вызываем thread.start();
и наслаждаемся результатом.
Как видно из 3-его примера, в основе лямбд лежит особый синтаксис (вот это непонятное () ->
). Для того чтобы понять это, вначале нужно вообще осознать, в каких случаях используются лямбды, вернее, где это допустимо синтаксисом языка. Я подчеркнул одно важное слово - функциональный интерфейс, именно на основе этого и работают лямбды. Функциональный интерфейс - это такой интерфейс, у которого всего один метод (как у Runnable только один метод run).
Можно написать свой собственный функциональный интерфейс. Вот:
interface CalculateEngine {
double add(double a, double b);
}
И затем, воспользоваться лямбдами
CalculateEngine calculateEngine = ((a, b) -> a + b);
System.out.println(calculateEngine.add(4.5, 3.2)); // 7.7
Аналогично можно провернуть это через анонимные классы (чтобы лучше понять, что да как)
CalculateEngine calculateEngine = new CalculateEngine() {
@Override
public double add(double a, double b) {
return a + b;
}
};
System.out.println(calculateEngine.add(4.5, 3.2)); // 7.7
Можно сделать вывод, что лямбда-выражения применяются там, где это удобно. Создание потоков, работа с коллекциями. Везде, где за основу взяты функциональный интерфейсы.
P.S: Ещё, хотел бы Вам сказать, что подобные вещи лучше читать в разных книгах/статьях и etc. Так-же, похожие вопросы уже задавали. Очень важно уметь гуглить.
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
Перевод документов на английский язык: Важность и ключевые аспекты
Возьмем просто андроид приложение : класс наследующий Activity в этом классе подключается layout и подписываемся на события от кнопокИ по определенному...
Есть метод, который описывает движение фигуры Слон на шахматной доскеПоследний Cell подсвечивается красным с ошибкой "Cell(int, int)' has private access in 'ru