Группировка элементов потока в Java
Коллектор groupingBy строит карту, где ключ
задает функция, а значение по умолчанию - список
элементов с этим ключом. Вложенный коллектор
меняет тип значения: вместо списка можно сразу
получить количество или сумму.
Строки разложим по длине:
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
public class Main {
public static void main(String[] args) {
List<String> words = List.of("go", "java", "io", "api");
Map<Integer, List<String>> byLength = words.stream()
.collect(Collectors.groupingBy(String::length));
System.out.println(byLength);
}
}
С counting внутри группы сразу видно, сколько
элементов попало в каждый ключ:
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
public class Main {
public static void main(String[] args) {
List<Integer> nums = List.of(1, 2, 3, 4, 5, 6);
Map<String, Long> parity = nums.stream()
.collect(Collectors.groupingBy(
n -> n % 2 == 0 ? "even" : "odd",
Collectors.counting()
));
System.out.println(parity);
}
}
Дан код:
var strings = List.of("api", "log", "ui", "kit");
Сгруппируйте строки по первой букве и выведите карту.
Дан код:
var nums = List.of(10, 11, 20, 21, 30);
Сгруппируйте по четности и посчитайте элементы в каждой группе.