Java中集合去重统计需据目标选择方法:整体去重用distinct().count();按字段去重用distinctByKey()保留首条;分组统计频次用groupingBy()+counting();去重后条件统计需先去重再filter。
Java 中用 Lambda 表达式做集合去重统计,核心是结合 Stream API 的 distinct()、collect() 和 Collectors.groupingBy() 等操作,按需选择“整体去重”或“按字段去重”,再配合计数逻辑完成统计。关键不在于写得有多炫,而在于明确目标:是只去重?还是去重后统计每类数量?或是统计去重后的总数?
适用于元素类型已正确重写 equals() 和 hashCode()(如 String、Integer 或自定义对象)的场景。
stream().distinct().count() 直接获取去重后元素个数stream().distinct().collect(Collectors.toList()) 得到新列表,再调用 size()
常见于对象集合(如 List<Person>),需根据 name 或 id 去重,且只留第一次出现的实例。
distinctByKey 工具方法(基于 ConcurrentHashMap 记录已见键)list.stream().filter(distinctByKey(Person::getName)).collect(Collectors.toList())
size();如需同时知道每个 name 出现几次,应改用分组统计而非此方式这不是“去重”,而是“去重统计”的另一层含义——明确各唯一值出现多少次,比如统计每个用户名出现次数。
立即学习“Java免费学习笔记(深入)”;
Collectors.groupingBy(keyMapper, Collectors.counting())
Map<K, Long>,key 是去重后的字段值,value 是该字段的出现次数nameCount.size()
比如:去重得到唯一用户后,再统计其中年龄大于 30 的人数。
list.stream().filter(distinctByKey(User::getId)).filter(u -> u.getAge() > 30).count()
filter,否则可能把本该保留的首条记录过滤掉