Gymterview
junior

Какие существуют способы создания стрима?

Стримы можно создать из множества источников данных. Ниже перечислены восемь основных способов.

Способ Пример
Из коллекции list.stream()
Из набора значений Stream.of("x", "y", "z")
Из массива Arrays.stream(array)
Из файла Files.lines(Paths.get("input.txt"))
Из строки "abc".chars()
Через Builder Stream.builder().add("a").add("b").build()
Через iterate (бесконечный) Stream.iterate(1, n -> n + 1)
Через generate (бесконечный) Stream.generate(Math::random)
Примеры кода для каждого способа
// 1. Из коллекции
Stream<String> fromCollection = Arrays.asList("x", "y", "z").stream();

// 2. Из набора значений
Stream<String> fromValues = Stream.of("x", "y", "z");

// 3. Из массива
Stream<String> fromArray = Arrays.stream(new String[]{"x", "y", "z"});

// 4. Из файла (каждая строка — элемент)
Stream<String> fromFile = Files.lines(Paths.get("input.txt"));

// 5. Из строки
IntStream fromString = "0123456789".chars();

// 6. С помощью Stream.builder()
Stream<String> fromBuilder = Stream.builder().add("z").add("y").add("z").build();

// 7. С помощью Stream.iterate() (бесконечный)
Stream<Integer> fromIterate = Stream.iterate(1, n -> n + 1);

// 8. С помощью Stream.generate() (бесконечный)
Stream<String> fromGenerate = Stream.generate(() -> "0");

Бесконечные стримы (iterate и generate) требуют ограничения через limit(), иначе конечная операция не завершится. Начиная с Java 9, метод iterate получил перегрузку с предикатом: Stream.iterate(0, n -> n < 10, n -> n + 1).

На собеседовании: назовите хотя бы 4-5 способов и упомяните, что iterate/generate создают бесконечные стримы. Также стоит знать, что стрим из файла (Files.lines) нужно закрывать (реализует AutoCloseable).