Давайте сначала приведем пример, чтобы показать преимущества потокового API Java 8.
Предположим, у нас есть следующие задачи:
Учитывая список строк, нам нужно сделать следующее:
-
Отфильтровать все строки, начинающиеся с «А».
-
Преобразуйте эти строки в верхний регистр.
-
Отсортируйте эти строки по длине.
-
Наконец, эти строки объединяются в одну строку, разделенную запятыми.
Java 7 и более ранние реализации:
В Java 7 реализация этой функции требует многоэтапной обработки, включающей циклы, условные оценки, сортировку и сращивание строк.
List<String> inputList = Arrays.asList("Apple", "An", "Banana", "Avocado", "Apricot", "Blueberry"); List<String> filteredList = new ArrayList<String>(); for (String s : inputList) { if (s.startsWith("A")) { filteredList.add(s.toUpperCase()); } } Collections.sort(filteredList, new Comparator<String>() { public int compare(String s1, String s2) { return Integer.compare(s1.length(), s2.length()); } }); StringBuilder sb = new StringBuilder(); for (int i = 0; i < filteredList.size(); i++) { sb.append(filteredList.get(i)); if (i < filteredList.size() - 1) { sb.append(", "); } } String result = sb.toString();
Реализация Java 8 с использованием потоков:
Ту же задачу можно решить более простым и интуитивно понятным способом, используя API потоков Java 8:
List<String> inputList = Arrays.asList("Apple", "An", "Banana", "Avocado", "Apricot", "Blueberry"); String result = inputList.stream() .filter(s -> s.startsWith("A")) .map(String::toUpperCase) .sorted(Comparator.comparingInt(String::length)) .collect(Collectors.joining(", "));
В сравнении
В реализации Java 7 нам необходимо явно выполнять циклы, условные оценки, сортировку и конкатенацию строк, что не только удлиняет код, но и затрудняет понимание логики с первого взгляда. В реализации Java 8 все эти операции интегрированы в цепной вызов в стиле конвейера, и каждый шаг понятен и интуитивно понятен.
filter
Использование таких методов , какmap
,sorted
иcollect
упрощает чтение и поддержку кода. В частности,Collectors.joining
код значительно упрощается за счет прямого объединения отфильтрованных и преобразованных списков строк в одну строку. Этот пример наглядно демонстрирует мощные возможности потокового API Java 8, особенно при работе со сложными операциями сбора данных, его преимущества очень очевидны.
1. Что такое поток?
Stream в Java 8 — это усовершенствование функциональности объектов-коллекций. Он ориентирован на выполнение различных очень удобных и эффективных операций агрегации (агрегатных операций) или операций с большими объемами данных (операций с большими объемами данных) над объектами-коллекциями. Stream API может значительно повысить производительность Java-программистов, позволяя программистам писать эффективный, чистый и лаконичный код.
Stream API в Java 8 обеспечивает эффективный декларативный способ обработки коллекций. Используя Stream API, вы можете выполнять сложные запросы, фильтрацию, преобразование, сортировку и другие операции с коллекциями, не беспокоясь о деталях базовой реализации.
2. Зачем использовать потоки?
В Java 8 появились потоки, чтобы сделать обработку собираемых данных более удобной и гибкой. Потоки предоставляют новую абстракцию, которая позволяет разработчикам работать с данными декларативным образом без необходимости явного использования итераторов или написания большого количества циклического кода.
3. Что произойдет, если течения не будет?
Хотя той же функциональности можно достичь и без использования потоков, использование потоков может обеспечить более чистый, эффективный и простой в обслуживании код, особенно при работе со сложными операциями с данными. API Streams — важная функция Java 8, которая значительно улучшает возможности языка Java по обработке коллекций.
4. Каковы характеристики Stream?
- Не является структурой данных : она не хранит данные, а используется для манипулирования данными в источниках данных (таких как коллекции, массивы и т. д.).
- Не изменяет исходный объект : он не изменяет исходный объект. Вместо этого он возвращает новый поток, содержащий результат.
- Ленивое выполнение : операции выполняются лениво, то есть ждут, пока не потребуются результаты.
- Расходимость : поток можно использовать только один раз. После прохождения он станет недействительным.
5. Часто используемые методы потоковой передачи?
Потоковые операции делятся на два типа: промежуточные операции и терминальные операции.
промежуточные операции
-
карта: преобразуйте элементы в другие формы или извлекайте информацию.
stream.map(String::toUpperCase);
-
фильтр: исключить определенные элементы.
stream.filter(e -> e.length() > 2);
-
sorted: гарантирует, что поток отсортирован по определенным критериям.
stream.sorted(Comparator.comparingInt(String::length));
-
предел: Уменьшите размер потока.
stream.limit(5);
-
Different (дедупликация): удаление повторяющихся элементов с помощью hashCode() и Equals() из элементов, сгенерированных потоком.
stream.distinct();
Работа терминала
-
forEach (итерация): перебирать все данные в потоке.
stream.forEach(System.out::println);
-
собирать: Преобразовать поток в другие формы.
List<String> list = stream.collect(Collectors.toList());
-
уменьшить (сокращение): повторно объединить все элементы в потоке, чтобы получить значение.
Integer sum = numbers.stream().reduce(0, Integer::sum);
-
AnyMatch, allMatch, noneMatch (матч): проверяет, соответствуют ли один или несколько элементов в потоке заданному предикату.
boolean anyMatch = stream.anyMatch(e -> e.startsWith("A"));
-
count: Возвращает количество элементов в потоке.
long count = stream.count();
-
findFirst, findAny (найти): возвращает первый или любой элемент в потоке.
Optional<String> first = stream.findFirst();
6. Пример
List<String> myList = Arrays.asList("a1", "a2", "b1", "c2", "c1");
myList.stream()
.filter(s -> s.startsWith("c"))
.map(String::toUpperCase)
.sorted()
.forEach(System.out::println); // C1, C2
В этом примере stream()
создается поток, filter()
метод отфильтровывает строки, которые не начинаются с «c», map()
метод преобразует каждую строку в верхний регистр, sorted()
метод сортирует строки и, наконец, forEach()
метод печатает каждый элемент.