如何用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
相关产品推荐
相关产品推荐

