只需将列表扁平化为单个流并使用groupingBy
集电极。
- 首先,只需流式传输列表。这将创建较小列表的流。
- 那么你需要流式传输这些内容。但你不需要 4 个字母流。您需要一个包含 16 个字母的流(或所有字母组的总和)。这就是 flatMap 的作用。它将多个流扁平化为一个。
- 那么你想要进行频率计数。因此,您想使用字母本身作为键对字母进行分组。默认情况下
groupingBy
将创建一个列表并将冲突(与重复键关联的值)放入列表中。
- 但你不希望这样,所以
Collectors.counting()
表示如果您看到另一个键已经存在,只需保留计数并将值更新为 1。因此您正在计算键的出现次数。
List<Set<String>> list = List.of(Set.of("A", "B", "C", "D"),
Set.of("B", "C", "D", "E"),
Set.of("C", "D", "E", "F"),
Set.of("D", "E", "F", "G"));
Map<String, Long> freq =
list.stream().flatMap(Set::stream).collect(Collectors
.groupingBy(a -> a, Collectors.counting()));
freq.entrySet().forEach(System.out::println);
Prints
A=1
B=2
C=3
D=4
E=3
F=2
G=1
这是默认的一个简单示例groupingBy
行为。它只是根据除以时的余数将值放入列表中10
. IntStream
生成一个流int primitives
所以它们需要转换为对象(Integer
在这种情况下)被收集。
Map<Integer, List<Integer>> remainders =
IntStream.range(0, 100).mapToObj(Integer::valueOf)
.collect(Collectors.groupingBy(n -> n % 10));
remainders.entrySet().forEach(System.out::println);
prints
0=[0, 10, 20, 30, 40, 50, 60, 70, 80, 90]
1=[1, 11, 21, 31, 41, 51, 61, 71, 81, 91]
2=[2, 12, 22, 32, 42, 52, 62, 72, 82, 92]
3=[3, 13, 23, 33, 43, 53, 63, 73, 83, 93]
4=[4, 14, 24, 34, 44, 54, 64, 74, 84, 94]
5=[5, 15, 25, 35, 45, 55, 65, 75, 85, 95]
6=[6, 16, 26, 36, 46, 56, 66, 76, 86, 96]
7=[7, 17, 27, 37, 47, 57, 67, 77, 87, 97]
8=[8, 18, 28, 38, 48, 58, 68, 78, 88, 98]
9=[9, 19, 29, 39, 49, 59, 69, 79, 89, 99]