Метод flatMapping
Метод flatMapping класса Collectors применяется
в качестве промежуточного коллектора внутри других коллекторов,
например groupingBy. Он принимает два параметра: первый -
функцию-маппер, которая преобразует каждый элемент потока
в новый поток (или другую коллекцию), второй - нижестоящий
коллектор, который собирает уже «развёрнутые» элементы.
В отличие от метода mapping, который отображает один
элемент в один элемент, flatMapping отображает один
элемент в несколько, после чего все результаты объединяются
в плоскую структуру.
Синтаксис
Collectors.flatMapping(mapper, downstream)
Пример
Давайте сгруппируем строки по первой букве и внутри
каждой группы развернём каждую строку в отдельные
символы с помощью flatMapping:
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", "cd");
Map<Character, List<Character>> res = list.stream()
.collect(Collectors.groupingBy(
s -> s.charAt(0),
Collectors.flatMapping(
s -> s.chars().mapToObj(c -> (char) c),
Collectors.toList()
)
));
System.out.println(res);
}
}
Результат выполнения кода:
{a=[a, b, c, d, e, a, b], c=[c, d]}
Пример
Давайте развернём каждую строку в поток её символов и соберём все символы в один список без группировки:
import java.util.List;
import java.util.stream.Collectors;
public class Main
{
public static void main(String[] args)
{
List<String> list = List.of("abcde", "12345");
List<Character> res = list.stream()
.collect(Collectors.flatMapping(
s -> s.chars().mapToObj(c -> (char) c),
Collectors.toList()
));
System.out.println(res);
}
}
Результат выполнения кода:
[a, b, c, d, e, 1, 2, 3, 4, 5]
Пример
Давайте отфильтруем пустые потоки: если строка пустая, её маппер вернёт пустой поток, и такие элементы не попадут в результат:
import java.util.List;
import java.util.stream.Collectors;
public class Main
{
public static void main(String[] args)
{
List<String> list = List.of("abcde", "", "12345");
List<Character> res = list.stream()
.collect(Collectors.flatMapping(
s -> s.chars().mapToObj(c -> (char) c),
Collectors.toList()
));
System.out.println(res);
}
}
Результат выполнения кода:
[a, b, c, d, e, 1, 2, 3, 4, 5]
Смотрите также
-
метод
mapping,
который преобразует элементы один к одному -
метод
groupingBy,
который группирует элементы по ключу -
метод
toList,
который собирает элементы в список -
класс
Collectors,
который содержит все коллекторы