Stream API: фильтрация (filter)

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

Тренажер по Java

Одна из самых частых задач при работе с данными — отбросить лишнее. В Stream API за это отвечает метод filter(). Это промежуточная операция, которая принимает предикат (условие) и оставляет в потоке только те элементы, для которых условие истинно (true).

Синтаксис прост: .filter(x -> x > 10). В этом примере пройдут только числа больше 10. Визуализация кода помогает понять, что filter работает как сито. Обратите внимание, что сам исходный список при этом не меняется. Наши онлайн примеры и тесты помогут вам научиться писать лаконичные условия фильтрации.

Список тем

1. Синтаксис лямбды

id: 40518_str_flt_01_replace

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

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

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

2. Результат фильтрации

id: 40518_str_flt_02_predict

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

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

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

3. Фильтрация null

id: 40518_str_flt_03_build

Из предложенных строк соберите корректную Java-программу, которая создаёт список строк, содержащий null-значения, затем с помощью Stream API фильтрует этот список, удаляя все null-значения, и собирает результат в новый список. Для фильтрации используйте метод filter с предикатом Objects::nonNull. В решении должны присутствовать только необходимые строки, лишние строки включать не нужно.

Перетяните в правильном порядке строки из одного блока в другой
import java.util.*;
public class Main {
    public static void main(String[] args) {
        List<String> list = Arrays.asList("a", null, "b", null, "c");
        List<String> result = list.stream()
                .filter(Objects::nonNull)
                .collect(Collectors.toList());
        System.out.println(result);
    }
}
import java.io.*;
        System.out.println(list);
                .filter(s -> s != null)
                .sorted()
Сообщения
Проверить
Показать решение на 3 сек.
Показать подсказку

4. Логическая ошибка условия

id: 40518_str_flt_04_error

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

Найдите ошибку и исправьте
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(1, 2, 3, 4, 5, 6, 7, 8, 9, 10);
        // Отфильтровать только нечётные числа
        List<Integer> oddNumbers = numbers.stream()
                .filter(n -> n % 2 == 0) // Ошибка здесь
                .collect(Collectors.toList());
        System.out.println("Нечётные числа: " + oddNumbers);
    }
}
Сообщения
Проверить
Показать решение на 3 сек.
Показать подсказку

5. Выбор предиката

id: 40518_str_flt_05_select

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

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

class User {
    private String name;
    private int age;
    
    public User(String name, int age) {
        this.name = name;
        this.age = age;
    }
    
    public int getAge() { return age; }
    public String getName() { return name; }
    
    @Override
    public String toString() {
        return name + " (" + age + ")";
    }
}

public class Main {
    public static void main(String[] args) {
        List<User> users = List.of(
            new User("Alice", 25),
            new User("Bob", 17),
            new User("Charlie", 30),
            new User("Diana", 70)
        );
        
        List<User> filtered = users.stream()
            .filter( input1S )
            .filter( input2S )
            .collect(Collectors.toList());
        
        System.out.println(filtered);
    }
}
Сообщения
Проверить
Показать решение на 3 сек.
Показать подсказку

6. Сколько осталось?

id: 40518_str_flt_06_give

В данном фрагменте кода создаётся поток целых чисел от 1 до 10 включительно. Затем к потоку последовательно применяются два фильтра: первый оставляет только чётные числа, второй — только числа, большие 5. В конце подсчитывается количество элементов, прошедших оба фильтра. Введите одно число — результат работы программы.

Что должно получиться?
import java.util.stream.IntStream;

public class Main {
    public static void main(String[] args) {
        long result = IntStream.rangeClosed(1, 10)
                               .filter(x -> x % 2 == 0)
                               .filter(x -> x > 5)
                               .count();
        System.out.println(result);
    }
}
Сообщения
Проверить
Показать подсказку
НайтиКурс.Ру