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

如何用Java 8 Lambda表达式统计List中B对象的数量

解决Java 8 Lambda统计List中指定类型对象数量的问题

现有List集合:

List<?> a = List.of(new C(), new B(), new A(), new D(), new B());

需要统计其中B对象的数量,你尝试的代码没得到正确结果,问题出在分组依据的选择上,下面是解决方案和问题分析:

正确解决方案

方案一:直接过滤统计

如果只需要统计B类型的数量,最直接的方式是先过滤出所有B类型的对象,再调用count()方法:

List<?> a = List.of(new C(), new B(), new A(), new D(), new B());
long bCount = a.stream()
               .filter(obj -> obj instanceof B)
               .count();
System.out.println(bCount); // 输出2

方案二:按类型分组统计所有对象

如果需要同时统计所有类型的对象数量,可以用对象的Class作为分组键,这样同类型的对象会被归为一组:

List<?> a = List.of(new C(), new B(), new A(), new D(), new B());
Map<Class<?>, Long> typeCountMap = a.stream()
                                   .collect(Collectors.groupingBy(Object::getClass, Collectors.counting()));
// 获取B类型的数量
System.out.println(typeCountMap.get(B.class)); // 输出2
// 打印所有类型的统计结果
System.out.println(typeCountMap); // 输出类似 {class A=1, class B=2, class C=1, class D=1}

原代码问题分析

你原来的代码使用Function.identity()作为分组依据,这会把每个对象实例本身当作分组键。由于默认情况下,Java的equals()方法比较的是对象的内存地址,两个new B()是不同的实例,所以会被分成两个独立的组,每个组的数量都是1,自然得不到你想要的结果。如果一定要用对象实例作为分组键,需要在B类中重写equals()和hashCode()方法,让逻辑上相同的B对象被判定为相等,但这对于单纯统计类型数量来说完全没必要,用上面的方案更简单直接。

内容的提问来源于stack exchange,提问作者sandy2608

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.06 04:16:09