Лямбда-выражения (синтаксис ->)

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

Тренажер по Java

Лямбда-выражения (Lambda expressions), появившиеся в Java 8, позволяют писать код в функциональном стиле. Это компактный способ записи анонимных функций.

Основной синтаксис: (параметры) -> { тело_функции }.

  • Если параметр один, скобки вокруг него можно опустить: x -> x * 2.
  • Если тело функции состоит из одной строки, фигурные скобки и слово return можно опустить.

Лямбды часто используются с функциональными интерфейсами (где есть только один абстрактный метод) и в Stream API. Этот тренажер поможет вам освоить стрелочный синтаксис -> и научиться читать сокращенные записи кода.

Список тем

1. Оператор лямбды

id: 40515_lambda_01_arrow

В этом задании вам нужно дополнить фрагмент кода на Java, используя лямбда-выражение. Код выводит элементы списка строк с помощью метода forEach. Вам необходимо вставить оператор лямбды '->' между аргументом и телом лямбда-выражения, чтобы код работал корректно. Обратите внимание на синтаксис лямбда-выражений в Java: (параметры) -> { тело } или (параметры) -> выражение. В данном случае используется вариант с одним параметром без фигурных скобок.

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

public class Main {
    public static void main(String[] args) {
        List<String> names = Arrays.asList("Anna", "Bob", "Charlie");
        names.forEach(name input1S System.out.println(name));
    }
}
Сообщения
Проверить
Показать решение на 3 сек.
Показать подсказку

2. Параметры лямбды

id: 40515_lambda_02_params

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

Нужно правильно расставить в пропуски предложенные варианты
BinaryOperator<Integer> sum1 = input1S -> a + b;
BinaryOperator<Integer> sum2 = input2S -> a + b;
Сообщения
Проверить
Показать решение на 3 сек.
Показать подсказку

3. Валидный синтаксис

id: 40515_lambda_03_validity

Перед вами несколько фрагментов кода, представляющих лямбда-выражения в Java. Распределите их по двум категориям: 'Правильная лямбда' и 'Ошибка синтаксиса'. Обратите внимание на синтаксис лямбда-выражений: они могут иметь параметры (со скобками или без), стрелку -> и тело (выражение или блок). Лямбда должна быть корректной в контексте функционального интерфейса.

Перетяните элементы в соответствующие блоки
Правильная лямбда
Ошибка синтаксиса
s -> s.length()
-> System.out.println()
(x) -> { return x; }
a, b -> a + b
() -> "Hello"
(int n) -> n * n
Сообщения
Проверить
Показать подсказку

4. Эволюция сокращения

id: 40515_lambda_04_shortening

Перед вами три варианта записи одного и того же кода на Java, реализующего компаратор для строк. Эти варианты демонстрируют эволюцию сокращения синтаксиса: от анонимного класса через полную лямбду к краткой лямбде. Блоки кода перемешаны. Ваша задача — расставить их в порядке от самого длинного (многословного) к самому короткому (краткому). Обратите внимание на количество строк и общий объём кода в каждом варианте.

Расставьте строки в правильном порядке
Comparator<String> comparator = (s1, s2) -> s1.compareTo(s2);
Comparator<String> comparator = (String s1, String s2) -> {
    return s1.compareTo(s2);
};
Comparator<String> comparator = new Comparator<String>() {
    @Override
    public int compare(String s1, String s2) {
        return s1.compareTo(s2);
    }
};
Сообщения
Проверить
Показать подсказку

5. Результат вычисления

id: 40515_lambda_05_predict

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

Выберите правильный вариант ответа
@FunctionalInterface
interface Operation {
    int execute(int a, int b);
}

public class Main {
    public static void main(String[] args) {
        Operation multiply = (x, y) -> x * y;
        int result = multiply.execute(5, 3);
        System.out.println(result);
    }
}
Сообщения
Проверить
Показать подсказку

6. Структура выражения

id: 40515_lambda_06_click

Перед вами фрагмент кода на Java, содержащий лямбда-выражение. Внимательно изучите его структуру. Ваша задача — выделить два ключевых элемента лямбда-выражения: блок аргументов (список параметров) и тело выражения (выполняемый код). Не отмечайте стрелку `->`, разделяющую эти части, или другие элементы кода, такие как объявление переменной или точку с запятой.

Кликните по всем фрагментам, которые подходят под условие задания.
// Пример использования лямбда-выражения в методе
Runnable task = {{(int count, String name)~|~t1}} {{->~|~t2}} {{
    for (int i = 0; i < count; i++) {
        System.out.println("Hello, " + name);
    }
~|~t3}};
// Конец объявления
Сообщения
Проверить
Показать подсказку

7. Сортировка списка

id: 40515_lambda_07_build

Из предложенных строк соберите корректный вызов метода sort для списка строк, который сортирует строки по длине с помощью лямбда-выражения. Лишние строки в решение включать не нужно. Учтите, что вызов метода должен быть синтаксически корректным и использовать лямбда-выражение для сравнения длин строк.

Перетяните в правильном порядке строки из одного блока в другой
list.sort(
(s1, s2) ->
Integer.compare(s1.length(), s2.length())
);
list.sort((s1, s2) -> s1.compareTo(s2));
list.sort(null);
Сообщения
Проверить
Показать решение на 3 сек.
Показать подсказку

8. Блочное тело лямбды

id: 40515_lambda_08_block_error

В данном фрагменте кода на Java используется лямбда-выражение с блочным телом, но допущена синтаксическая ошибка, из-за которой код не скомпилируется. Найдите строку с ошибкой и исправьте её, чтобы лямбда-выражение корректно возвращало результат. Обратите внимание на правила написания блочных лямбда-выражений, когда тело состоит из нескольких операторов.

Найдите ошибку и исправьте
import java.util.function.Function;
 
public class Main {
    public static void main(String[] args) {
        Function<Integer, Integer> square = (x) -> {
            int result = x * x;
            result;
        };
        System.out.println(square.apply(5));
    }
}
Сообщения
Проверить
Показать решение на 3 сек.
Показать подсказку

9. Запуск Runnable

id: 40515_lambda_09_runnable

В данном задании рассматривается использование лямбда-выражения для создания экземпляра интерфейса Runnable. Проанализируйте приведённый фрагмент кода и определите, что будет выведено в консоль после его выполнения. Введите результат в виде одной строки без пробелов и дополнительных символов.

Что должно получиться?
public class Main {
    public static void main(String[] args) {
        Runnable task = () -> System.out.print("Go");
        task.run();
        task.run();
    }
}
Сообщения
Проверить
Показать подсказку
НайтиКурс.Ру