27. 如何统计集合中每个元素的出现次数?请使用Map和Stream API举例说明。
在 Java 中,使用 Map
和 Stream API
可以轻松地统计集合中每个元素的出现次数。下面我将展示如何使用这两种方法来统计集合中元素的出现次数。
方法 1: 使用 Map 进行统计
可以使用 Map
手动迭代集合,并记录每个元素的出现次数。
import java.util.HashMap;
import java.util.List;
import java.util.Map;
public class ElementCountExample {
public static void main(String[] args) {
List<String> items = List.of("apple", "banana", "apple", "orange", "banana", "apple");
Map<String, Integer> countMap = new HashMap<>();
for (String item : items) {
countMap.put(item, countMap.getOrDefault(item, 0) + 1);
}
System.out.println(countMap); // 输出: {orange=1, banana=2, apple=3}
}
}
代码说明
-
List.of()
: 创建一个包含多个字符串的不可变列表。 -
countMap.put(item, countMap.getOrDefault(item, 0) + 1)
: 遍历列表中的每个元素,并在Map
中统计每个元素的出现次数。getOrDefault()
方法用于在键不存在时返回默认值0
,然后加1
。
方法 2: 使用 Stream API 进行统计
使用 Java 8 的 Stream API
可以更加简洁地统计集合中每个元素的出现次数。
import java.util.List;
import java.util.Map;
import java.util.function.Function;
import java.util.stream.Collectors;
public class ElementCountStreamExample {
public static void main(String[] args) {
List<String> items = List.of("apple", "banana", "apple", "orange", "banana", "apple");
Map<String, Long> countMap = items.stream()
.collect(Collectors.groupingBy(Function.identity(), Collectors.counting()));
System.out.println(countMap); // 输出: {orange=1, banana=2, apple=3}
}
}
代码说明
-
items.stream()
: 将集合转换为流(Stream)。 -
Collectors.groupingBy()
: 使用groupingBy
按照元素分组。Function.identity()
作为分类函数,表示按元素本身分组。 -
Collectors.counting()
: 统计每个分组的数量。 -
Map<String, Long> countMap
: 最终结果是一个Map
,键为集合中的元素,值为该元素的出现次数。
总结
-
使用
Map
统计:这是传统且简单的方法,适用于任何 Java 版本。它清晰且易于理解,适合需要更多控制和定制统计逻辑的场景。 -
使用
Stream API
统计:这是一种更为简洁和函数式的写法,适用于 Java 8 及以上版本。Stream API
使代码更简洁,并且适合链式调用和复杂的数据处理。
这两种方法都能有效地统计集合中每个元素的出现次数,可以根据实际需求和个人喜好选择合适的方式。