Преобразование данных с помощью Stream

Ввод/вывод и потоки в Java

Alex Liu

Software Development Engineer

Преобразование данных с помощью Stream

  • Преобразование данных с помощью Stream

    • Конвертация форматов, агрегация и фильтрация данных
    • Сохранение результатов в новый тип коллекции (например, из List в Set)
    • Поддерживаемые коллекции:
      • Lists (например, ArrayList, LinkedList)
      • Sets (например, HashSet, TreeSet)
      • Maps (Keys/Values как Streams) (например, HashMap, TreeMap)
      • Arrays (через Arrays.stream())
  • Пример ArrayList с именем names для использования далее

    names: ["Alice", "Bob", "Charlie", "David"]
    
Ввод/вывод и потоки в Java

Преобразование элементов с помощью Stream

  • Подготовка: импортируйте классы Set, Collectors и Stream
import java.util.Set;
import java.util.stream.Collectors;
import java.util.stream.Stream;

// Convert the `ArrayList` we created earlier `names` to a `Stream` Stream<String> namesStream = names.stream();
  • Текущие данные: [Alice, Bob, Charlie, David]
Ввод/вывод и потоки в Java

Преобразование элементов с помощью Stream (продолжение)

// Use `.map()` to convert each element to upper case
Stream<String> upperCaseNameStream = namesStream.map(
        name -> name.toUpperCase())
  • Текущие данные: [ALICE, BOB, CHARLIE, DAVID]
// use `.collect()` and `Collectors.toSet()` to store the transformed stream data
upperCaseNameStream.collect(Collectors.toSet())
  • Итоговые данные:
    {CHARLIE, ALICE, BOB, DAVID}
    
Ввод/вывод и потоки в Java

Агрегация с помощью Stream

  • Метод .reduce()

    • Агрегирует элементы в единый результат
    • Подходит для суммирования, конкатенации и поиска минимума/максимума
  • Метод .reduce() принимает два аргумента

    • Начальное значение: стартовое значение накопления, например 0
    • Бинарный оператор: функция, принимающая два аргумента
      • (x, y) -> x + y означает:
        • x — накопленный итог
        • y — текущий обрабатываемый элемент
        • Операция прибавляет y к x до обработки всех элементов
Ввод/вывод и потоки в Java

Агрегация с помощью Stream: пример

  • Преобразуйте ArrayList names в объект Stream.
    Stream<String> stream = names.stream();
    
  • Используйте .map() для получения длины каждого имени и .reduce() для их суммирования
    stream
      .map(name -> name.length())
      .reduce(0, (sum, length) -> sum + length);
    
  • Результат: 20
Ввод/вывод и потоки в Java

Давайте потренируемся!

Ввод/вывод и потоки в Java

Preparing Video For Download...