С какими источниками данных работает Stream API в Java?

«С какими источниками данных работает Stream API в Java?» — вопрос из категории Java Core, который задают на 10% собеседований Java Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Stream API в Java работает с данными из различных источников:

  • Коллекции: Любые классы, реализующие интерфейс Collection (List, Set, Queue).
    List<String> list = Arrays.asList("a", "b", "c");
    Stream<String> streamFromList = list.stream();
  • Массивы: Через утилитарный класс Arrays.
    String[] array = {"a", "b", "c"};
    Stream<String> streamFromArray = Arrays.stream(array);
  • Примитивные потоки: Специализированные интерфейсы IntStream, LongStream, DoubleStream.
    IntStream intStream = IntStream.range(1, 5); // 1, 2, 3, 4
  • Файлы: Через методы класса Files.
    Stream<String> lines = Files.lines(Paths.get("file.txt"));
  • Генераторы и итераторы: Методы Stream.generate(), Stream.iterate().
    Stream<Double> randomStream = Stream.generate(Math::random).limit(5);
  • Другие источники: Любые объекты, реализующие интерфейс Iterable или Iterator.

Важно: Stream не хранит данные и не изменяет исходную коллекцию. Операции делятся на промежуточные (lazy, например filter, map) и терминальные (eager, например collect, forEach), которые запускают выполнение конвейера.