Какими способами можно создать поток (Stream) в Java Stream API?

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

Ответ

В Java Stream API существует несколько основных способов создания потоков.

1. Из коллекций (наиболее частый случай):

List<String> list = List.of("A", "B", "C");
Stream<String> streamFromList = list.stream();
Stream<String> parallelStream = list.parallelStream();

2. Из массивов:

String[] array = {"A", "B", "C"};
Stream<String> streamFromArray = Arrays.stream(array);
// Для примитивов:
IntStream intStream = Arrays.stream(new int[]{1, 2, 3});

3. Используя фабричные методы Stream.of():

Stream<String> streamOfElements = Stream.of("A", "B", "C");

4. Генерация бесконечных потоков:

// Генерация последовательности (0, 2, 4, 6...)
Stream<Integer> evenNumbers = Stream.iterate(0, n -> n + 2);
// Генерация случайных чисел
Stream<Double> randomNumbers = Stream.generate(Math::random);

5. Из файлов (NIO.2):

Stream<String> lines = Files.lines(Paths.get("data.txt"));

6. Специализированные потоки для примитивов:

IntStream range = IntStream.range(1, 10);       // 1..9
LongStream longStream = LongStream.of(1L, 2L);
DoubleStream randomDoubles = DoubleStream.generate(Math::random);

7. Из String (символов или кодовых точек):

IntStream charCodes = "text".chars();