«Если рабочий хочет хорошо выполнять свою работу, он должен сначала заточить свои инструменты» — Конфуций, «Аналитики Конфуция. Лу Лингун»
титульная страница > программирование > Потоки и лямбды в Java: руководство по функциональному программированию с примерами

Потоки и лямбды в Java: руководство по функциональному программированию с примерами

Опубликовано 21 августа 2024 г.
Просматривать:314

Streams and Lambdas in Java: A Guide to Functional Programming with Examples

Функциональное программирование — широко используемый подход в современной разработке программного обеспечения. Java, будучи языком, поддерживающим как объектно-ориентированное, так и функциональное программирование, в своей 8-й версии представила потоки и лямбды. Эти функции позволяют разработчикам применять к коллекциям функциональный стиль, делая операции с коллекциями более эффективными и понятными.

Потоки в Java
Потоки в Java превращают коллекцию в поток элементов. Они позволяют разработчикам выполнять функциональные операции с коллекциями, такие как сопоставление, фильтрация и сокращение. Потоки лучше всего использовать для операций, связанных с преобразованием, агрегированием или фильтрацией данных.

Пример использования потоков — сортировка списка имен в алфавитном порядке. Мы можем создать список имен, а затем использовать потоки для его сортировки, как показано ниже:

List name = Arrays.asList("Джон", "Мэри", "Дэвид", "Эмили", "Том");
names.stream().sorted().forEach(System.out::println); //вывод: Дэвид, Эмили, Джон, Мэри, Том

Здесь мы создали поток, используя методstream() в списке. Затем мы применили метод sorted() для сортировки элементов потока в естественном порядке. Наконец, метод forEach() используется для печати каждого элемента потока.

Лямбды в Java
Лямбды используются для определения первоклассных функций в Java. Эти функции могут получать элементы из потока и выполнять над ними операции. Лямбды определяются вне класса и могут передаваться в качестве аргументов функциям.

Чтобы использовать лямбды с потоками, нам необходимо понимать концепцию функциональных интерфейсов. Это интерфейсы, имеющие только один абстрактный метод. Лямбда-выражения можно использовать для предоставления конкретной реализации абстрактного метода функционального интерфейса.

Сортировка списка имен с помощью лямбда-выражений
Опираясь на приведенный выше пример, давайте отсортируем имена в порядке убывания, используя лямбда-выражения.

List name = Arrays.asList("Джон", "Мэри", "Дэвид", "Эмили", "Том");
имена.поток().sorted((a, b) -> b.compareTo(a)).forEach(System.out::println)); //вывод: Том, Мэри, Джон, Эмили, Дэвид

Здесь мы использовали лямбда-выражение в качестве аргумента метода sorted(). Эта лямбда-функция принимает два аргумента (a и b) и сравнивает их, возвращая положительное, отрицательное или нулевое значение на основе сравнения. Это позволяет нам сортировать элементы в порядке убывания, используя метод CompareTo() для элементов.

Превратите поток обратно в коллекцию
В некоторых случаях нам может потребоваться снова превратить поток в коллекцию после выполнения над ним операций. Мы можем сделать это с помощью метода Collect(), который принимает объект Collector в качестве аргумента.

List filteredNames = names.stream()
.filter(name -> name.length() > 4) //сохраняем только имена длиной > 4
.collect(Коллекторы.toList()); //возвращаем список отфильтрованных имен

Метод Collect() принимает функциональный интерфейс типа Collector и использует его для накопления элементов в коллекцию. В приведенном выше примере мы использовали метод toList() из класса Collectors для создания списка отфильтрованных имен.

Другие операции с потоками
Помимо сортировки и фильтрации, над потоками можно выполнять и другие операции, такие как сопоставление, сокращение и итерация. Эти операции позволяют нам преобразовывать, уменьшать и перебирать элементы в потоке соответственно.

Сопоставление и сокращение потока чисел
Допустим, у нас есть список чисел и мы хотим найти сумму всех четных чисел. Мы можем сделать это, используя методы Map() и Reduc().

Числа List = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9, 10);
int sum = Numbers.stream()
.filter(num -> num % 2 == 0) //фильтруем нечетные числа
.map(num -> num * 2) //удваиваем четные числа
.reduce(0, (a, b) -> a b); //складываем все числа вместе

Здесь мы использовали метод map() для удвоения четных чисел в потоке, а затем использовали метод уменьшения() для сложения всех чисел. Результатом является сумма всех четных чисел в списке.

Операции повторного использования в потоках
В некоторых случаях нам может потребоваться использовать одну и ту же функциональную операцию для нескольких потоков. Чтобы избежать повторного написания одного и того же кода, мы можем создать функциональный интерфейс и передать его в качестве аргумента методам.

Давайте рассмотрим пример сортировки списка имен по фамилии. Мы можем создать класс компаратора, реализующий интерфейс Comparator, и передать его в качестве аргумента методу sorted().

статический класс LastNameComparator реализует Comparator {
@Override
public int Compare(Имя строки1, Имя строки2) {
String[] parts1 = name1.split(" ");
Строка LastName1 = parts1[parts1.length - 1];
String[] parts2 = name2.split(" ");
Строка LastName2 = parts2[parts2.length - 1];
вернуть LastName2.compareTo(lastName1);
}
}

names.stream().sorted(new LastNameComparator()).forEach(System.out::println); //вывод: Эмили, Дэвид, Джон, Мэри, Том

Здесь мы передали LastNameComparator в качестве аргумента методу sorted() для сортировки имен по фамилии.

Заключение
Потоки и лямбды в Java предоставляют мощный и эффективный способ выполнения функциональных операций над коллекциями. Они позволяют разработчикам писать чистый, краткий и пригодный для повторного использования код. Понимая концепции потоков и лямбда-выражений, мы можем улучшить наши общие навыки программирования и писать более эффективный код.

Одним из эффективных способов улучшить свои навыки работы с Java является получение последней сертификации Java и использование практических тестов 1Z0-830, доступных на MyExamCloud.

Заявление о выпуске Эта статья воспроизведена по адресу: https://dev.to/myexamcloud/streams-and-lambdas-in-java-a-guide-to-functional-programming-with-examples-4cij?1 Если есть какие-либо нарушения, пожалуйста, свяжитесь с Study_golang@163 .comdelete
Последний учебник Более>

Изучайте китайский

Отказ от ответственности: Все предоставленные ресурсы частично взяты из Интернета. В случае нарушения ваших авторских прав или других прав и интересов, пожалуйста, объясните подробные причины и предоставьте доказательства авторских прав или прав и интересов, а затем отправьте их по электронной почте: [email protected]. Мы сделаем это за вас как можно скорее.

Copyright© 2022 湘ICP备2022001581号-3