Java 8中如何将含重复元素的Stream转换为统计次数的HashMap
Java 8 Stream转HashMap统计剧集出现次数
嘿,刚上手Java 8的话,这个统计重复剧集名称次数的需求其实超级简单,用Stream自带的收集器就能一步搞定,完全不用你纠结的filter操作哦!
核心思路
你要的是把Stream里的重复元素分组,然后统计每组的数量,Java 8的Collectors工具类刚好有现成的组合:用groupingBy按剧集名称分组,搭配counting统计每组元素的个数,还能指定生成HashMap。
代码示例
先模拟你的剧集名称Stream:
import java.util.HashMap; import java.util.Map; import java.util.function.Function; import java.util.stream.Collectors; import java.util.stream.Stream; public class ShowCountExample { public static void main(String[] args) { // 模拟你的剧集名称Stream Stream<String> showNames = Stream.of( "LOTR", "Lucifer", "Breaking Bad", "LOTR", "Exorcist", "The Godfather", "The Godfather", "Lucifer" ); // 转换为HashMap,键是剧集名,值是出现次数 Map<String, Long> showCountMap = showNames.collect( Collectors.groupingBy( Function.identity(), // 直接用剧集名称作为键,等价于s -> s HashMap::new, // 指定生成HashMap类型的结果 Collectors.counting()// 统计每个分组的元素数量 ) ); // 打印结果验证 showCountMap.forEach((name, count) -> System.out.println(name + ": " + count)); } }
代码解释
Function.identity():这是个简洁写法,作用就是把Stream里的每个元素(也就是剧集名称)直接作为Map的键,和写s -> s效果完全一样;HashMap::new:明确告诉收集器我们要生成的是HashMap,如果不指定这一项,groupingBy默认会返回一个普通的Map实现(比如LinkedHashMap),但你需要HashMap的话加上这个参数就好;Collectors.counting():负责统计每个分组里元素的个数,返回的是Long类型的计数。
关于你之前的filter误区
你提到用filter(x->x.equals(x)),其实这个条件对所有元素都成立(每个元素肯定等于自己),根本起不到过滤重复的作用,反而多此一举。统计重复元素次数的正确姿势就是直接分组统计,不需要提前过滤。
运行上面的代码,你会得到这样的输出:
Breaking Bad: 1 Lucifer: 2 LOTR: 2 Exorcist: 1 The Godfather: 2
内容的提问来源于stack exchange,提问作者Diana G
相关产品推荐
相关产品推荐

