Метод filter
Метод filter класса Stream фильтрует элементы
потока по заданному условию. Метод принимает один параметр -
функцию-предикат типа Predicate, которая принимает
элемент потока и возвращает boolean: true,
если элемент должен остаться в потоке, и false, если
элемент нужно отбросить. Метод возвращает новый поток,
состоящий только из тех элементов исходного потока, для
которых предикат вернул true. Исходный поток при
этом не изменяется. Метод является промежуточной операцией
и выполняется лениво - только при вызове терминальной операции.
Синтаксис
Stream<T> filter(Predicate<? super T> predicate)
Пример
Давайте отфильтруем из потока чисел только чётные числа:
import java.util.List;
import java.util.stream.Collectors;
public class Main
{
public static void main(String[] args)
{
List<Integer> res = List.of(1, 2, 3, 4, 5)
.stream()
.filter(n -> n % 2 == 0)
.collect(Collectors.toList());
System.out.println(res);
}
}
Результат выполнения кода:
[2, 4]
Пример
Давайте отфильтруем из потока строк только те строки,
которые начинаются с символа "a":
import java.util.List;
import java.util.stream.Collectors;
public class Main
{
public static void main(String[] args)
{
List<String> res = List.of("abcde", "12345", "apple", "banana")
.stream()
.filter(s -> s.startsWith("a"))
.collect(Collectors.toList());
System.out.println(res);
}
}
Результат выполнения кода:
["abcde", "apple"]
Пример
Давайте применим несколько фильтров подряд, чтобы отобрать
числа, которые больше 1 и меньше 5:
import java.util.List;
import java.util.stream.Collectors;
public class Main
{
public static void main(String[] args)
{
List<Integer> res = List.of(1, 2, 3, 4, 5)
.stream()
.filter(n -> n > 1)
.filter(n -> n < 5)
.collect(Collectors.toList());
System.out.println(res);
}
}
Результат выполнения кода:
[2, 3, 4]
Пример
Давайте с помощью метода filter отбросим все пустые
строки и выведем результат:
import java.util.List;
import java.util.stream.Collectors;
public class Main
{
public static void main(String[] args)
{
List<String> res = List.of("abcde", "", "12345", "", "apple")
.stream()
.filter(s -> !s.isEmpty())
.collect(Collectors.toList());
System.out.println(res);
}
}
Результат выполнения кода:
["abcde", "12345", "apple"]
Пример
Давайте с помощью метода filter найдём сумму чисел,
которые делятся на 3 без остатка:
import java.util.List;
public class Main
{
public static void main(String[] args)
{
int res = List.of(1, 2, 3, 4, 5, 6, 7, 8, 9)
.stream()
.filter(n -> n % 3 == 0)
.mapToInt(n -> n)
.sum();
System.out.println(res);
}
}
Результат выполнения кода:
18