Одна из самых частых задач при работе с данными — отбросить лишнее. В Stream API за это отвечает метод filter(). Это промежуточная операция, которая принимает предикат (условие) и оставляет в потоке только те элементы, для которых условие истинно (true).
Синтаксис прост: .filter(x -> x > 10). В этом примере пройдут только числа больше 10. Визуализация кода помогает понять, что filter работает как сито. Обратите внимание, что сам исходный список при этом не меняется. Наши онлайн примеры и тесты помогут вам научиться писать лаконичные условия фильтрации.
- Модуль 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. Синтаксис лямбды
В этом задании вам предстоит дополнить фрагмент кода на 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);
}
}2. Результат фильтрации
Проанализируйте приведённый код на 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
Из предложенных строк соберите корректную 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()4. Логическая ошибка условия
В данном фрагменте кода используется 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); }}5. Выбор предиката
В данном задании вам предстоит заполнить пропуски в коде, выбирая подходящие лямбда-выражения из выпадающего списка. Код демонстрирует использование 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);
}
}6. Сколько осталось?
В данном фрагменте кода создаётся поток целых чисел от 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);
}
}