Stream API: преобразование (map)

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

Тренажер по Java

Метод map() используется для преобразования данных. Если filter сокращает количество элементов, то map изменяет сами элементы, сохраняя их количество. Он принимает функцию, которая применяется к каждому элементу потока.

Пример: .map(String::toUpperCase) превратит все строки в верхний регистр. Часто тип данных на выходе меняется: например, из потока строк мы получаем поток чисел (длин этих строк). Это основа паттерна Map-Reduce. Проходя эти уроки, вы научитесь трансформировать данные на лету, используя компактный и читаемый код.

Список тем

1. Выбор преобразования

id: 40519_str_map_01_select

В данном задании представлен фрагмент кода на Java, который работает со списком объектов класса Person. Класс Person имеет поля: name (имя), age (возраст), salary (зарплата) и соответствующие геттеры. Вам необходимо заполнить пропуски в коде, выбрав из выпадающих списков правильный метод преобразования Stream API и соответствующую ссылку на метод-геттер, чтобы получить список имён сотрудников. Обратите внимание, что для преобразования потока объектов в поток их имён используется операция map, а в качестве маппера — ссылка на метод, возвращающий нужное поле.

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

class Person {
    private String name;
    private int age;
    private double salary;
    
    public Person(String name, int age, double salary) {
        this.name = name;
        this.age = age;
        this.salary = salary;
    }
    
    public String getName() { return name; }
    public int getAge() { return age; }
    public double getSalary() { return salary; }
}

public class Main {
    public static void main(String[] args) {
        List<Person> employees = List.of(
            new Person("Alice", 30, 50000),
            new Person("Bob", 25, 45000),
            new Person("Charlie", 35, 60000)
        );
        
        // Получить список имён сотрудников
        List<String> names = employees.stream()
                                      .input1S(input2S)
                                      .collect(Collectors.toList());
        
        System.out.println(names);
    }
}
Сообщения
Проверить
Показать решение на 3 сек.
Показать подсказку

2. Математика в map

id: 40519_str_map_02_replace

В этом задании вам предстоит поработать с методом map из Stream API в Java. Дан поток целых чисел. Вам нужно дополнить лямбда-выражение внутри метода map так, чтобы каждое число потока возводилось в квадрат. Обратите внимание, что в лямбде используется параметр n, представляющий текущий элемент потока. После правильного заполнения пропуска программа должна вывести квадраты чисел 1, 2, 3, 4, 5.

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

public class Main {
    public static void main(String[] args) {
        List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5);
        numbers.stream()
               .map(n -> input1S)
               .forEach(System.out::println);
    }
}
Сообщения
Проверить
Показать решение на 3 сек.
Показать подсказку

3. Вход и выход

id: 40519_str_map_03_compare

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

Сопоставьте строки в правой(нижней) части с соответствующими строками в левой(верхней) по порядковому номеру
stream.map(s -> s.length())
stream.map(Integer::parseInt)
stream.map(user -> user.getName())
stream.map(s -> s.toLowerCase())
stream.mapToInt(x -> x)
String -> String (приведение к нижнему регистру)
User -> String (получение имени пользователя)
String -> Integer (получение длины строки)
Integer -> int (распаковка в примитив)
String -> Integer (парсинг строки в число)
Сообщения
Проверить
Показать подсказку

4. Цепочка map

id: 40519_str_map_04_predict

Проанализируйте представленный код на Java, использующий Stream API с цепочкой преобразований map. Определите, что будет выведено в консоль в результате выполнения программы. Обратите внимание на последовательность преобразований: сначала числа преобразуются в строки, затем вычисляется длина каждой строки.

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

public class Main {
    public static void main(String[] args) {
        List<Integer> numbers = Arrays.asList(5, 12, 150);
        List<Integer> result = numbers.stream()
                                      .map(n -> "Number: " + n)
                                      .map(String::length)
                                      .collect(Collectors.toList());
        System.out.println(result);
    }
}
Сообщения
Проверить
Показать подсказку

5. Отсутствие возврата

id: 40519_str_map_05_error

В данном фрагменте кода на Java используется Stream API для преобразования списка строк. Однако в лямбда-выражении внутри метода map допущена синтаксическая ошибка: при использовании фигурных скобок для тела лямбды забыто ключевое слово return. Исправьте ошибку, чтобы код успешно компилировался и выполнял преобразование строк в верхний регистр.

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

6. Логика обработки

id: 40519_str_map_06_sequencing

Перед вами строки java-кода, демонстрирующие использование Stream API для преобразования и фильтрации данных. Строки перемешаны. Вам необходимо восстановить правильную последовательность, чтобы получить корректную программу, которая из списка строк, представляющих числа, создаёт поток, преобразует строки в целые числа, фильтрует неотрицательные значения и собирает результат в новый список. Обратите внимание на порядок операций в цепочке Stream API.

Расставьте строки в правильном порядке
        .map(Integer::parseInt)
List<Integer> positiveNumbers = stringNumbers.stream()
        .collect(Collectors.toList());
        .filter(n -> n >= 0)
List<String> stringNumbers = Arrays.asList("1", "2", "-3", "4", "-5");
Сообщения
Проверить
Показать подсказку

7. Метод Reference

id: 40519_str_map_07_build

Из предложенных строк соберите корректную Java-программу, которая преобразует список строк в список их длин, используя Stream API и ссылку на метод (::) внутри map. Программа должна вывести результат в консоль. Игнорируйте лишние строки, которые не требуются для решения или используют лямбда-выражение вместо ссылки на метод.

Перетяните в правильном порядке строки из одного блока в другой
import java.util.List;
import java.util.Arrays;
import java.util.stream.Collectors;
import java.util.ArrayList;
public class Main {
    public static void main(String[] args) {
        List<String> words = Arrays.asList("apple", "banana", "cherry");
        List<Integer> lengths = words.stream()
                .map(s -> s.length())
                .map(String::length)
                .map(String::toUpperCase)
                .collect(Collectors.toList());
                .collect(Collectors.toSet());
        System.out.println(lengths);
        System.out.println(words);
    }
}
Сообщения
Проверить
Показать решение на 3 сек.
Показать подсказку
НайтиКурс.Ру