Функциональное программирование — широко используемый подход в современной разработке программного обеспечения. Java, будучи языком, поддерживающим как объектно-ориентированное, так и функциональное программирование, в своей 8-й версии представила потоки и лямбды. Эти функции позволяют разработчикам применять к коллекциям функциональный стиль, делая операции с коллекциями более эффективными и понятными.
Потоки в Java
Потоки в Java превращают коллекцию в поток элементов. Они позволяют разработчикам выполнять функциональные операции с коллекциями, такие как сопоставление, фильтрация и сокращение. Потоки лучше всего использовать для операций, связанных с преобразованием, агрегированием или фильтрацией данных.
Пример использования потоков — сортировка списка имен в алфавитном порядке. Мы можем создать список имен, а затем использовать потоки для его сортировки, как показано ниже:
List
names.stream().sorted().forEach(System.out::println); //вывод: Дэвид, Эмили, Джон, Мэри, Том
Здесь мы создали поток, используя методstream() в списке. Затем мы применили метод sorted() для сортировки элементов потока в естественном порядке. Наконец, метод forEach() используется для печати каждого элемента потока.
Лямбды в Java
Лямбды используются для определения первоклассных функций в Java. Эти функции могут получать элементы из потока и выполнять над ними операции. Лямбды определяются вне класса и могут передаваться в качестве аргументов функциям.
Чтобы использовать лямбды с потоками, нам необходимо понимать концепцию функциональных интерфейсов. Это интерфейсы, имеющие только один абстрактный метод. Лямбда-выражения можно использовать для предоставления конкретной реализации абстрактного метода функционального интерфейса.
Сортировка списка имен с помощью лямбда-выражений
Опираясь на приведенный выше пример, давайте отсортируем имена в порядке убывания, используя лямбда-выражения.
List
имена.поток().sorted((a, b) -> b.compareTo(a)).forEach(System.out::println)); //вывод: Том, Мэри, Джон, Эмили, Дэвид
Здесь мы использовали лямбда-выражение в качестве аргумента метода sorted(). Эта лямбда-функция принимает два аргумента (a и b) и сравнивает их, возвращая положительное, отрицательное или нулевое значение на основе сравнения. Это позволяет нам сортировать элементы в порядке убывания, используя метод CompareTo() для элементов.
Превратите поток обратно в коллекцию
В некоторых случаях нам может потребоваться снова превратить поток в коллекцию после выполнения над ним операций. Мы можем сделать это с помощью метода Collect(), который принимает объект Collector в качестве аргумента.
List
.filter(name -> name.length() > 4) //сохраняем только имена длиной > 4
.collect(Коллекторы.toList()); //возвращаем список отфильтрованных имен
Метод Collect() принимает функциональный интерфейс типа Collector и использует его для накопления элементов в коллекцию. В приведенном выше примере мы использовали метод toList() из класса Collectors для создания списка отфильтрованных имен.
Другие операции с потоками
Помимо сортировки и фильтрации, над потоками можно выполнять и другие операции, такие как сопоставление, сокращение и итерация. Эти операции позволяют нам преобразовывать, уменьшать и перебирать элементы в потоке соответственно.
Сопоставление и сокращение потока чисел
Допустим, у нас есть список чисел и мы хотим найти сумму всех четных чисел. Мы можем сделать это, используя методы Map() и Reduc().
Числа List
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.
Отказ от ответственности: Все предоставленные ресурсы частично взяты из Интернета. В случае нарушения ваших авторских прав или других прав и интересов, пожалуйста, объясните подробные причины и предоставьте доказательства авторских прав или прав и интересов, а затем отправьте их по электронной почте: [email protected]. Мы сделаем это за вас как можно скорее.
Copyright© 2022 湘ICP备2022001581号-3