You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 09:19:46