Метод partitioningBy
Метод partitioningBy класса Collectors
разделяет элементы потока на две группы по заданному
условию. В отличие от метода groupingBy, который
может создавать произвольное количество групп,
partitioningBy всегда создает ровно две группы:
одну для элементов, удовлетворяющих условию (ключ
true), и вторую для всех остальных (ключ
false). В первый параметр мы передаем предикат -
функцию, возвращающую булево значение. Вторым
необязательным параметром можно передать нижестоящий
коллектор, который будет применен к каждой из двух групп.
Результатом работы метода является объект типа
Collector, который при использовании в методе
collect возвращает Map<Boolean, List<T>>
или другой тип, определяемый нижестоящим коллектором.
Синтаксис
Collectors.partitioningBy(predicate)
Collectors.partitioningBy(predicate, downstream)
Пример
Давайте разделим список чисел на четные и нечетные:
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
public class Main
{
public static void main(String[] args)
{
List<Integer> list = List.of(1, 2, 3, 4, 5);
Map<Boolean, List<Integer>> res = list.stream()
.collect(Collectors.partitioningBy(n -> n % 2 == 0));
System.out.println(res);
}
}
Результат выполнения кода:
{false=[1, 3, 5], true=[2, 4]}
Пример
Давайте разделим список строк по длине и посчитаем
количество элементов в каждой группе, передав
нижестоящий коллектор counting:
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
public class Main
{
public static void main(String[] args)
{
List<String> list = List.of("abcde", "ab", "abc", "a", "abcd");
Map<Boolean, Long> res = list.stream()
.collect(Collectors.partitioningBy(
s -> s.length() > 3,
Collectors.counting()
));
System.out.println(res);
}
}
Результат выполнения кода:
{false=3, true=2}
Пример
Давайте разделим список строк по условию и соберем
каждую группу в множество с помощью нижестоящего
коллектора toSet:
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.stream.Collectors;
public class Main
{
public static void main(String[] args)
{
List<String> list = List.of("abcde", "abcde", "ab", "abc", "ab");
Map<Boolean, Set<String>> res = list.stream()
.collect(Collectors.partitioningBy(
s -> s.length() > 2,
Collectors.toSet()
));
System.out.println(res);
}
}
Результат выполнения кода:
{false=[ab], true=[abcde, abc]}
Смотрите также
-
класс
Collectors,
который содержит коллекторы для потоков -
метод
groupingBy,
который группирует элементы по ключу -
метод
counting,
который подсчитывает количество элементов -
метод
filtering,
который фильтрует элементы потока