Stream API — это мощный инструмент в Java 8+, который позволяет обрабатывать наборы данных в функциональном стиле. Представьте, что Streams (потоки) — это конвейер, по которому движутся объекты. Вы не меняете саму коллекцию, а создаете последовательность действий над данными.
Чтобы начать работу, нужно создать поток. Самые частые способы:
collection.stream()— создание из списка или множества.Arrays.stream(array)— создание из массива.Stream.of(val1, val2)— перечисление элементов вручную.
Эти уроки и задания помогут вам освоить синтаксис создания потоков, который является первым шагом в мир функционального программирования. Наш тренажер java позволит закрепить создание Stream на практике без сложной теории.
- Модуль 1: Первая программа и структура
- Модуль 2: Переменные и типы данных
- Объявление и инициализация переменных.
- Примитивы: целые числа (int, long, byte, short).
- Примитивы: дробные числа (double, float).
- Примитивы: логический тип (boolean).
- Примитивы: символьный тип (char).
- String — основы работы со строками.
- Приведение типов (Casting): расширение и сужение.
- Область видимости переменных (Scope).
- Модуль 3: Операторы
- Модуль 4: Управляющие конструкции
- Модуль 5: Массивы и Строки (Advanced)
- Создание и заполнение массива.
- Доступ к элементам по индексу.
- Свойство length и перебор массива.
- Цикл for-each для массивов.
- Многомерные массивы.
- Методы String: length, charAt, isEmpty.
- Манипуляции: substring, concat, replace.
- Сравнение строк: equals vs ==.
- Разделение строк (split) и trim.
- StringBuilder (изменяемые строки).
- Модуль 6: Методы
- Модуль 7: Классы и Объекты (ООП Часть 1)
- Модуль 8: Капсуляция и Модификаторы
- Модуль 9: Наследование и Полиморфизм (ООП Часть 2)
- Модуль 10: Обработка исключений
- Модуль 11: Коллекции и Дженерики
- Модуль 12: Функциональный стиль (Java 8+)
- Модуль 13: Полезные стандарты
1. Метод stream()
В этом задании вам предстоит отработать создание потока данных из коллекции с помощью метода 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);
}
}2. Источники потока
В данном фрагменте кода представлены различные источники данных: массив, коллекция (список) и отдельные элементы. Для каждого случая необходимо выбрать подходящий метод создания потока (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. Ошибка в Stream.of
В данном фрагменте кода 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); }}4. Количество элементов
Проанализируйте приведённый код на 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. Сборка конвейера
Из предложенных строк соберите корректную 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); }}6. Типы данных
Внимательно изучите приведённый фрагмент кода на 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);
}
}