Подробное объяснение Stream API в Java 8.

Давайте сначала приведем пример, чтобы показать преимущества потокового API Java 8.

Предположим, у нас есть следующие задачи:

Учитывая список строк, нам нужно сделать следующее:

  1. Отфильтровать все строки, начинающиеся с «А».

  2. Преобразуйте эти строки в верхний регистр.

  3. Отсортируйте эти строки по длине.

  4. Наконец, эти строки объединяются в одну строку, разделенную запятыми.

    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()метод печатает каждый элемент.

Acho que você gosta

Origin blog.csdn.net/wykqh/article/details/135142869
Recomendado
Clasificación