Stream API: сборка результата (collect)

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

Тренажер по Java

В Java Stream API метод collect() является терминальной операцией. Это значит, что он запускает обработку потока данных и собирает результат в какую-либо структуру данных, например, в List, Set или String.

Для определения того, как именно собирать данные, используется класс-помощник Collectors. Примеры:

  • .collect(Collectors.toList()) — собирает элементы потока в список.
  • .collect(Collectors.joining()) — объединяет элементы-строки в одну строку.

Этот урок научит вас материализовывать результаты работы стримов обратно в привычные коллекции Java.

Список тем

1. Сборка в список

id: 40520_stream_collect_replace_01

В этом задании вам нужно дополнить код, который обрабатывает поток целых чисел, чтобы собрать результат в список. Используйте терминальную операцию `collect` с соответствующим коллектором из класса `Collectors`. Заполните пропуски в вызове метода так, чтобы программа корректно скомпилировалась и вывела список отфильтрованных чисел.

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

public class Main {
    public static void main(String[] args) {
        List<Integer> numbers = Arrays.asList(10, 20, 30, 40, 50);
        List<Integer> filtered = numbers.stream()
                                        .filter(n -> n > 25)
                                        .input1S(Collectors.input2S());
        System.out.println(filtered);
    }
}
Сообщения
Проверить
Показать решение на 3 сек.
Показать подсказку

2. Коллекторы и результаты

id: 40520_stream_collect_match_02

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

Сопоставьте строки в правой(нижней) части с соответствующими строками в левой(верхней) по порядковому номеру
Collectors.toList()
Collectors.toSet()
Collectors.joining(", ")
Collectors.toMap(k -> k, v -> v)
List
Map
Set
String
Сообщения
Проверить
Показать подсказку

3. Цепочка стрима

id: 40520_stream_collect_build_from_parts_03

Соберите Java-программу, которая создает список имен, фильтрует его, оставляя только имена, начинающиеся на букву "A", собирает результат в новый список и выводит его в консоль. Убедитесь, что тип переменной результата соответствует возвращаемому значению терминальной операции.

Перетяните в правильном порядке строки из одного блока в другой
import java.util.List;
import java.util.stream.Collectors;
public class Main {
    public static void main(String[] args) {
        List<String> names = List.of("Ann", "Bob", "Alice");
        List<String> result = names.stream()
            .filter(s -> s.startsWith("A"))
            .collect(Collectors.toList());
            .collect(Collectors.toSet());
        System.out.println(result);
        stream(names)
    }
}
Сообщения
Проверить
Показать решение на 3 сек.
Показать подсказку

4. Забытый класс Collectors

id: 40520_stream_collect_error_04

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

Найдите ошибку и исправьте
import java.util.List;
import java.util.stream.Collectors;
import java.util.stream.Stream;
 
public class Main {
    public static void main(String[] args) {
        List<String> names = List.of("Alice", "Bob", "Charlie");
        List<String> upperNames = names.stream()
            .map(String::toUpperCase)
            .collect(toList()); // Ошибка здесь
        System.out.println(upperNames);
    }
}
Сообщения
Проверить
Показать решение на 3 сек.
Показать подсказку

5. Результат joining

id: 40520_stream_collect_predict_result_05

Проанализируйте приведённый фрагмент кода на Java, использующий Stream API и коллектор Collectors.joining(). Определите, какая строка будет выведена на экран в результате выполнения программы. Обратите внимание на исходный список строк и разделитель, указанный в методе joining.

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

public class Main {
    public static void main(String[] args) {
        List<String> words = Arrays.asList("Java", "Stream", "API");
        String result = words.stream().collect(Collectors.joining("-"));
        System.out.println(result);
    }
}
Сообщения
Проверить
Показать подсказку

6. Терминальная операция

id: 40520_stream_collect_click_target_07

Внимательно изучите представленный фрагмент кода на Java, использующий Stream API. Ваша задача — найти и отметить кликом все вызовы терминальной операции `collect`, которые завершают поток и собирают результат. Не отмечайте промежуточные операции (такие как `filter`, `map`, `sorted`), другие терминальные операции (например, `forEach`) или любые другие элементы кода.

Кликните по всем фрагментам, которые подходят под условие задания.
List<String> names = Arrays.asList("Anna", "Bob", "Alice", "David");

// Преобразование списка в поток и фильтрация
List<String> longNames = names.{{stream~|~t0}}()
    .{{filter~|~t1}}(n -> n.length() > 3)
    .{{collect~|~t2}}(Collectors.toList());

// Другая цепочка: сбор в строку
String result = names.stream()
    .{{map~|~t3}}(String::toUpperCase)
    .{{collect~|~t4}}(Collectors.joining(", "));

// Третья цепочка: группировка по длине
Map<Integer, List<String>> grouped = names.stream()
    .{{sorted~|~t5}}()
    .{{collect~|~t6}}(Collectors.groupingBy(String::length));

// Вывод результатов
longNames.{{forEach~|~t7}}(System.out::println);
Сообщения
Проверить
Показать подсказку
НайтиКурс.Ру