假设我们现在需要统计并输出一个有重复元素的数组中每个元素及对应元素出现的个数,相信各位都能够想到,我们使用一个Map就很容易解决这个问题,代码如下:
String[] arr = {"a", "c", "a", "b", "d", "c"};
Map<String, Integer> map = new HashMap<>();
for (String s : arr) {
if (map.containsKey(s)) {
map.put(s, map.get(s) + 1);
} else {
map.put(s, 1);
}
}
map.forEach((key, value) -> System.out.println(key + " : " + value));
如果对Map中的API更加熟悉的小伙伴,可能会写出下面这个更加简洁的代码:
String[] arr = {"a", "c", "a", "b", "d", "c"};
Map<String, Integer> map = new HashMap<>();
for (String s : arr) {
map.put(s, map.getOrDefault(s, 0) + 1);
}
map.forEach((key, value) -> System.out.println(key + " : " + value));
但是,如果使用stream,我们还能写出更加简洁的代码,同样不需要写烦人的循环了,而且只需两行代码即可
String[] arr = {"a", "c", "a", "b", "d", "c"};
Stream.of(arr)
.collect(Collectors.toMap(k -> k, k -> 1, Integer::sum))
.forEach((k, v) -> System.out.println(k + " : " + v));
在上面的代码中,Collectors.toMap(k -> k, k -> 1, Integer::sum)
这一部分可能不好理解,对于这里面的三个参数,第一个参数代表将arr中的每一个元素作为Map中的key,第二个参数代表每一个key所对应的value,在这里每一个元素都对应个数1,第三个参数代表,如果存在相同的key,该如何进行合并,这里通过使用Integer::sum
,代表将具有相同key的元素进行合并时,其value进行相加,这样便实现了每个元素个数的统计。