Stream API: создание потока

Тренажер по Java для пользователей с начальным уровнем подготовки.

Тренажер по Java

Stream API — это мощный инструмент в Java 8+, который позволяет обрабатывать наборы данных в функциональном стиле. Представьте, что Streams (потоки) — это конвейер, по которому движутся объекты. Вы не меняете саму коллекцию, а создаете последовательность действий над данными.

Чтобы начать работу, нужно создать поток. Самые частые способы:

  • collection.stream() — создание из списка или множества.
  • Arrays.stream(array) — создание из массива.
  • Stream.of(val1, val2) — перечисление элементов вручную.

Эти уроки и задания помогут вам освоить синтаксис создания потоков, который является первым шагом в мир функционального программирования. Наш тренажер java позволит закрепить создание Stream на практике без сложной теории.

Список тем

1. Метод stream()

id: 40517_str_cr_01_replace

В этом задании вам предстоит отработать создание потока данных из коллекции с помощью метода stream(). Дан код, который создаёт список строк и выполняет подсчёт элементов. Однако для работы с Stream API необходимо сначала преобразовать коллекцию в поток. Заполните пропуск в коде, чтобы программа могла корректно обработать список и вывести количество элементов. Обратите внимание, что после заполнения пропуска код должен компилироваться и работать без ошибок.

Заполните пропуски
import java.util.Arrays;
import java.util.List;
import java.util.stream.Stream;

public class Main {
    public static void main(String[] args) {
        List<String> fruits = Arrays.asList("apple", "banana", "cherry");
        Stream<String> stream = fruitsinput1S;
        long count = stream.count();
        System.out.println("Количество элементов: " + count);
    }
}
Сообщения
Проверить
Показать решение на 3 сек.
Показать подсказку

2. Источники потока

id: 40517_str_cr_02_select

В данном фрагменте кода представлены различные источники данных: массив, коллекция (список) и отдельные элементы. Для каждого случая необходимо выбрать подходящий метод создания потока (Stream) из предложенных вариантов. Обратите внимание на типы источников: для массивов используется Arrays.stream, для коллекций — collection.stream, а для отдельных элементов — Stream.of. Заполните пропуски, чтобы код корректно создавал потоки.

Нужно правильно расставить в пропуски предложенные варианты
import java.util.Arrays;
import java.util.List;
import java.util.stream.Stream;

public class StreamCreationExample {
    public static void main(String[] args) {
        // Создание потока из массива целых чисел
        int[] numbersArray = {1, 2, 3, 4, 5};
        Stream<Integer> streamFromArray = input1S;

        // Создание потока из списка строк
        List<String> wordsList = Arrays.asList("Java", "Stream", "API");
        Stream<String> streamFromList = input2S;

        // Создание потока из отдельных элементов
        Stream<String> streamOfElements = input3S;
    }
}
Сообщения
Проверить
Показать решение на 3 сек.
Показать подсказку

3. Ошибка в Stream.of

id: 40517_str_cr_03_error

В данном фрагменте кода Java, использующем Stream API, допущена синтаксическая ошибка при создании потока из набора элементов. Ошибка связана с неправильным использованием статического метода Stream.of. Внимательно изучите код, найдите строку с ошибкой и исправьте её, чтобы программа успешно скомпилировалась и выполнилась.

Найдите ошибку и исправьте
import java.util.stream.Stream;
 
public class Main {
    public static void main(String[] args) {
        // Создание потока из трёх строк
        Stream<String> languages = stream.of("Java", "Kotlin", "Scala");
        languages.forEach(System.out::println);
    }
}
Сообщения
Проверить
Показать решение на 3 сек.
Показать подсказку

4. Количество элементов

id: 40517_str_cr_04_predict

Проанализируйте приведённый код на Java, в котором создаётся поток (Stream) из нескольких элементов и сразу вызывается терминальная операция count(). Выберите число, которое вернёт метод count(). Обратите внимание на способ создания потока и количество добавленных в него элементов.

Выберите правильный вариант ответа
import java.util.stream.Stream;

public class Main {
    public static void main(String[] args) {
        long result = Stream.of(10, 20, 30, 40, 50)
                            .count();
        System.out.println(result);
    }
}
Сообщения
Проверить
Показать подсказку

5. Сборка конвейера

id: 40517_str_cr_05_build

Из предложенных строк соберите корректную Java-программу, которая создаёт список строк, преобразует его в поток (Stream), фильтрует строки по длине (оставляет только строки длиной больше 3) и выводит отфильтрованные строки в консоль. Лишние строки в решение включать не нужно.

Перетяните в правильном порядке строки из одного блока в другой
import java.util.List;
import java.util.Arrays;
public class Main {
    public static void main(String[] args) {
        List<String> words = Arrays.asList("cat", "elephant", "dog", "giraffe");
        words.stream()
             .filter(s -> s.length() > 3)
             .forEach(System.out::println);
        System.out.println(words);
        words.forEach(System.out::println);
    }
}
Сообщения
Проверить
Показать решение на 3 сек.
Показать подсказку

6. Типы данных

id: 40517_str_cr_06_click

Внимательно изучите приведённый фрагмент кода на Java. В нём создаётся поток (стрим) из источника данных. Ваша задача — отметить переменную, которая является этим источником данных (коллекцию или массив), из которой непосредственно рождается стрим. Не отмечайте сам вызов метода stream(), промежуточные операции, переменную для хранения потока или другие элементы кода.

Кликните по всем фрагментам, которые подходят под условие задания.
import java.util.*;
import java.util.stream.*;

public class StreamCreationExample {
    public static void main(String[] args) {
        // Имеется несколько коллекций и массивов
        List {{names~|~t1}} = Arrays.asList("Anna", "Bob", "Charlie");
        Set {{numbers~|~t2}} = new HashSet<>(Arrays.asList(10, 20, 30));
        String[] {{cities~|~t3}} = {"Moscow", "London", "Tokyo"};
        
        // Создание потока из источника данных
        Stream {{nameStream~|~t4}} = {{names~|~t5}}.stream();
        
        // Дополнительные операции не являются источником
        nameStream.filter(s -> s.length() > 3)
                  .forEach(System.out::println);
    }
}
Сообщения
Проверить
Показать подсказку
НайтиКурс.Ру