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

Java Streams: полное руководство для начинающих

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

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

Готовый? Давайте углубимся в Java Streams!


Java Streams: The Ultimate Guide for Complete Beginners


Что такое поток в Java?

Поток — это способ последовательной обработки данных. Представьте, что у вас есть список элементов, и вы хотите что-то с ними сделать (отфильтровать, отсортировать, сопоставить и т. д.). Stream позволяет вам делать все это чистым и эффективным способом. Это похоже на сборочную линию, на которой ваши данные проходят различные этапы, пока не будут обработаны.

Основные сведения о трансляциях:

  1. Потоки не изменяют исходные данные. Думайте о них как о представлении или конвейере ваших данных.
  2. Потоки обрабатывают данные лениво, то есть они не выполняют никакой реальной работы, пока вы не прикажете им выдать окончательный результат. Это позволяет избежать ненужных вычислений.
  3. Потоки предназначены для одноразового использования. Как только поток был использован, он исчезает. Вам нужно будет создать новый, если вы хотите использовать его повторно.

Зачем использовать потоки?

Почему бы просто не использовать цикл for или напрямую не манипулировать коллекциями? Ну, есть три основные причины:

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

Как работают потоки? Основы

Давайте рассмотрим два основных типа потоковых операций: Промежуточный и Терминальный.

1. Промежуточные операции

Это операции, которые подготавливают данные, но не сразу дают окончательный результат. Думайте об этом как о шагах «семинара».

  • фильтр()

    Это как решето. Он выбирает элементы на основе условия. Например, если вам нужны только четные числа из списка целых чисел, вы должны использовать filter().

    java
    Copy code
    List numbers = 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
    List words = Arrays.asList("apple", "banana", "cherry");
    List lengths = words.stream()
                                 .map(String::length)
                                 .collect(Collectors.toList());
    // Output: [5, 6, 6]
    
    

    Зачем использовать карту? Map() используется, когда вам нужно преобразовать каждый элемент во что-то другое, например преобразовать список строк в список их длин.

  • отчетливый()

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

    java
    Copy code
    List numbers = 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
    List names = Arrays.asList("Charlie", "Alice", "Bob");
    List sortedNames = names.stream()
                                    .sorted()
                                    .collect(Collectors.toList());
    // Output: ["Alice", "Bob", "Charlie"]
    
    

    Почему сортируется? Вместо того, чтобы писать логику сортировки самостоятельно, sorted() сделает это за вас.

2. Терминальные операции

Это те, которые выдают конечный результат и запускают обработку всего потока. Думайте об этом как о «точке выхода».

  • собирать()

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

    java
    Copy code
    List names = 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 предоставляет другие типы потоков для обработки различных типов данных:


Java Streams: The Ultimate Guide for Complete Beginners


  1. IntStream, LongStream, DoubleStream

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

    Пример:

    java
    Copy code
    IntStream intStream = IntStream.of(1, 2, 3, 4);
    int sum = intStream.sum();  // Output: 10
    
    
  2. Поток файлов

    Вы можете создавать потоки из файлов с помощью Files.lines().

    java
    Copy code
    try (Stream lines = Files.lines(Paths.get("data.txt"))) {
        lines.forEach(System.out::println);
    } catch (IOException e) {
        e.printStackTrace();
    }
    
    

    Зачем использовать файловые потоки? При работе с большими файлами загрузка всех данных в память может оказаться неэффективной. Использование потока позволяет обрабатывать его построчно.


Когда использовать потоки?

  • Преобразование данных: когда вам нужно изменить каждый элемент коллекции.
  • Фильтрация: если вы хотите выбрать только те данные, которые соответствуют определенным условиям.
  • Агрегирование данных: когда вам нужно свести коллекцию к одному результату (например, сумме, среднему значению).
  • Параллельная обработка: потоки также поддерживают параллелизм. С помощью .parallelStream() вы можете разделить задачи на несколько потоков для более быстрой обработки.

Поток против циклов: почему бы просто не использовать циклы?

Хороший вопрос! Давайте сравним:

  1. Читаемость: с помощью Streams вы сосредотачиваетесь на том, что вы хотите сделать, а не на как. Циклы обычно заставляют вас писать много дополнительного шаблонного кода (например, счетчиков и условных операторов).
  2. Производительность: потоки оптимизированы для эффективной обработки больших данных, особенно при отложенном вычислении и параллелизме. Циклы не предлагают таких готовых оптимизаций.
  3. Гибкость: потоки позволяют объединять операции (такие как фильтрация, сопоставление и сокращение) в понятный и функциональный стиль. Циклы потребуют вложения в них большего количества логики.

Подведение итогов

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

Теперь, когда вы хорошо знакомы с основами Streams, зачем на этом останавливаться? Следуйте за мной в Twitter, LinkedIn или посетите мой блог, чтобы получить дополнительные советы по Java, которые в кратчайшие сроки сделают вас профессионалом! И если это руководство показалось вам полезным, поделитесь им со своими коллегами-разработчиками, потому что делиться — значит заботиться!


Готовы попробовать? Давайте включим этот поток в ваш следующий проект!

Заявление о выпуске Эта статья воспроизведена по адресу: https://dev.to/wittedtech-by-harshit/java-streams-the-ultimate-guide-for-complete-beginners-40e2?1 Если есть какие-либо нарушения, пожалуйста, свяжитесь с Study_golang@163 .com, чтобы удалить его
Последний учебник Более>

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

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

Copyright© 2022 湘ICP备2022001581号-3