Лямбда-выражения — это новая функция, представленная в Java 8, и в сочетании с методом forEach более удобно реализовать обход. Кроме того, он может заменить класс Runnable, что значительно упрощает написание кода.
Вот несколько распространенных сценариев применения, в которых использование лямбда-выражений в нужное время более лаконично и удобно, чем обычно.
Список итераций
Работайте с каждым элементом списка без использования лямбда-выражений следующим образом:
List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5);
for (int element : numbers) {
System.out.prinln(element);
}
Используйте лямбда-выражения:
List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5);
numbers.forEach(x -> System.out.println(x));
Если вам нужно вызвать только одну функцию для обработки элементов списка, вы можете использовать более краткийссылка на методВместо лямбда-выражений:
List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5);
numbers.forEach(System.out::println);
прослушиватель событий
Без использования лямбда-выражений:
button.addActionListener(new ActionListener(){
@Override
public void actionPerformed(ActionEvent e) {
//handle the event
}
});
С лямбда-выражениями вам нужно заключить несколько операторов в фигурные скобки:
button.addActionListener(e -> {
//handle the event
});
Предикатный интерфейс
Интерфейс Predicate в пакете java.util.function можно легко использовать для фильтрации. Если вам нужно отфильтровать несколько объектов и выполнить одну и ту же логику обработки, вы можете инкапсулировать эти же операции в метод фильтра, а вызывающий объект предоставляет условия фильтра для повторного использования.
Без использования интерфейса Predicate для каждого объекта нужно прописать условия фильтрации и логику обработки:
List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5);
List<String> words = Arrays.asList("a", "ab", "abc");
numbers.forEach(x -> {
if (x % 2 == 0) {
//process logic
}
})
words.forEach(x -> {
if (x.length() > 1) {
//process logic
}
})
Используйте интерфейс Predicate, чтобы инкапсулировать ту же логику обработки в метод фильтра и многократно вызывать его:
public static void main(String[] args) {
List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5);
List<String> words = Arrays.asList("a", "ab", "abc");
filter(numbers, x -> (int)x % 2 == 0);
filter(words, x -> ((String)x).length() > 1);
}
public static void filter(List list, Predicate condition) {
list.forEach(x -> {
if (condition.test(x)) {
//process logic
}
})
}
Метод фильтра можно также записать так:
public static void filter(List list, Predicate condition) {
list.stream().filter(x -> condition.test(x)).forEach(x -> {
//process logic
})
}
карта
Используйте метод map объекта Stream, чтобы сопоставить исходный список с другим списком с помощью лямбда-выражения и преобразовать его обратно в тип List с помощью метода collect:
List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5);
List<Integer> mapped = numbers.stream().map(x -> x * 2).collect(Collectors.toList());
mapped.forEach(System.out::println);
Уменьшить агрегацию
Операция сокращения заключается в агрегировании всех элементов с помощью бинарных операций и, наконец, получении результата. Например, использование сложения для агрегирования списка означает сложение всех элементов в списке для получения суммы.
Следовательно, мы можем обеспечить сокращение лямбда-выражением, которое принимает два аргумента, что эквивалентно бинарной операции:
List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5);
int sum = numbers.stream().reduce((x, y) -> x + y).get();
System.out.println(sum);
вместо Runnable
Взяв за пример создание потока, код, использующий класс Runnable, выглядит следующим образом:
Runnable r = new Runnable() {
@Override
public void run() {
//to do something
}
};
Thread t = new Thread(r);
t.start();
Используйте лямбда-выражения:
Runnable r = () -> {
//to do something
};
Thread t = new Thread(r);
t.start();
Или используйте более компактную форму:
Thread t = new Thread(() -> {
//to do something
});
t.start;
Статьи по Теме
- Условия гонки, мьютексы и синхронизация в многопоточности Java
- Как Java использует интерфейсы, чтобы избежать обратных вызовов функций
- Графический интерфейс Java: Awt/Swing реализует масштабирование и прокрутку изображений.
- Java Web: три картинки для понимания Servlet, Filter, Listener
- Разница между созданием объектов в Java и C++ с помощью new
- Eclipse импортирует веб-проект Java, созданный Maven