Итак, вы здесь, чтобы узнать о ручьях на Java, а не о тех ручьях, где люди ловят рыбу или о потоках воды. Мы говорим о потоках данных, мощной функции, представленной в Java 8, которая значительно упрощает работу с данными. Независимо от того, новичок ли вы в этом или уже пробовали, но не смогли разобраться, не волнуйтесь. Я проведу вас через все путешествие простым и понятным языком.
Готовый? Давайте углубимся в Java Streams!
Поток — это способ последовательной обработки данных. Представьте, что у вас есть список элементов, и вы хотите что-то с ними сделать (отфильтровать, отсортировать, сопоставить и т. д.). Stream позволяет вам делать все это чистым и эффективным способом. Это похоже на сборочную линию, на которой ваши данные проходят различные этапы, пока не будут обработаны.
Основные сведения о трансляциях:
Почему бы просто не использовать цикл for или напрямую не манипулировать коллекциями? Ну, есть три основные причины:
Давайте рассмотрим два основных типа потоковых операций: Промежуточный и Терминальный.
Это операции, которые подготавливают данные, но не сразу дают окончательный результат. Думайте об этом как о шагах «семинара».
фильтр()
Это как решето. Он выбирает элементы на основе условия. Например, если вам нужны только четные числа из списка целых чисел, вы должны использовать filter().
java Copy code Listnumbers = Arrays.asList(1, 2, 3, 4, 5); List evenNumbers = numbers.stream() .filter(n -> n % 2 == 0) .collect(Collectors.toList()); // Output: [2, 4]
Зачем фильтровать? Без filter() вам пришлось бы вручную перебирать список и добавлять в новый список только совпадающие элементы. filter() позволяет сделать это за один шаг.
карта()
Это трансформер. Он принимает элемент и возвращает что-то другое. Например, если у вас есть список строк и вам нужна длина каждой строки:
java Copy code Listwords = Arrays.asList("apple", "banana", "cherry"); List lengths = words.stream() .map(String::length) .collect(Collectors.toList()); // Output: [5, 6, 6]
Зачем использовать карту? Map() используется, когда вам нужно преобразовать каждый элемент во что-то другое, например преобразовать список строк в список их длин.
отчетливый()
Это похоже на дублирующийся фильтр. Это удалит повторяющиеся элементы из потока.
java Copy code Listnumbers = Arrays.asList(1, 2, 2, 3, 4, 4, 5); List distinctNumbers = numbers.stream() .distinct() .collect(Collectors.toList()); // Output: [1, 2, 3, 4, 5]
Почему разные? В обычном списке вам придется вручную проверять наличие дубликатов. Different() сделает это за вас в одной строке.
сортировано()
Это сортирует ваши данные в естественном порядке (или в произвольном порядке, если хотите).
java Copy code Listnames = Arrays.asList("Charlie", "Alice", "Bob"); List sortedNames = names.stream() .sorted() .collect(Collectors.toList()); // Output: ["Alice", "Bob", "Charlie"]
Почему сортируется? Вместо того, чтобы писать логику сортировки самостоятельно, sorted() сделает это за вас.
Это те, которые выдают конечный результат и запускают обработку всего потока. Думайте об этом как о «точке выхода».
собирать()
Это наиболее распространенная операция терминала. Он собирает результаты потока и помещает их в список, набор или другую коллекцию.
java Copy code Listnames = Arrays.asList("Charlie", "Alice", "Bob"); List upperNames = names.stream() .map(String::toUpperCase) .collect(Collectors.toList()); // Output: ["CHARLIE", "ALICE", "BOB"]
Зачем собирать? Вы почти всегда будете использовать метод Collect() для сбора результатов вашего потока в коллекцию. Это ваша последняя остановка.
forEach()
Если вам не нужен результат и вы просто хотите выполнить действие над каждым элементом (например, распечатать его), forEach() — ваш помощник.
java Copy code numbers.stream() .forEach(System.out::println);
Почему forEach? Это идеально подходит для побочных эффектов, таких как вывод данных на консоль или запись в файл.
уменьшать()
reduce() принимает кучу данных и сводит их к одному результату. Например, суммирование списка чисел:
java Copy code int sum = numbers.stream() .reduce(0, Integer::sum); // Output: 15
Зачем сокращать? Если вам нужно объединить или накопить значения в единый результат, вам подойдет функция уменьшения().
Не все потоки создаются на основе коллекций. Java предоставляет другие типы потоков для обработки различных типов данных:
IntStream, LongStream, DoubleStream
Эти потоки специализированы для работы с примитивными типами. Вместо упаковки и распаковки значений, таких как Stream
Пример:
java Copy code IntStream intStream = IntStream.of(1, 2, 3, 4); int sum = intStream.sum(); // Output: 10
Поток файлов
Вы можете создавать потоки из файлов с помощью Files.lines().
java Copy code try (Streamlines = Files.lines(Paths.get("data.txt"))) { lines.forEach(System.out::println); } catch (IOException e) { e.printStackTrace(); }
Зачем использовать файловые потоки? При работе с большими файлами загрузка всех данных в память может оказаться неэффективной. Использование потока позволяет обрабатывать его построчно.
Хороший вопрос! Давайте сравним:
Потоки в Java предназначены для упрощения способа обработки данных. Они делают ваш код более читабельным, простым в обслуживании и более эффективным при работе с коллекциями. Независимо от того, фильтруете ли вы, преобразуете или сокращаете данные, Streams предоставит вам понятные и простые методы, которые устраняют необходимость в громоздких циклах и ручной работе.
Теперь, когда вы хорошо знакомы с основами Streams, зачем на этом останавливаться? Следуйте за мной в Twitter, LinkedIn или посетите мой блог, чтобы получить дополнительные советы по Java, которые в кратчайшие сроки сделают вас профессионалом! И если это руководство показалось вам полезным, поделитесь им со своими коллегами-разработчиками, потому что делиться — значит заботиться!
Готовы попробовать? Давайте включим этот поток в ваш следующий проект!
Отказ от ответственности: Все предоставленные ресурсы частично взяты из Интернета. В случае нарушения ваших авторских прав или других прав и интересов, пожалуйста, объясните подробные причины и предоставьте доказательства авторских прав или прав и интересов, а затем отправьте их по электронной почте: [email protected]. Мы сделаем это за вас как можно скорее.
Copyright© 2022 湘ICP备2022001581号-3