Общие сценарии применения лямбда-выражений Java

Java задняя часть

Лямбда-выражения — это новая функция, представленная в 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;

Статьи по Теме

Loading Likes...