JavaFX统计ObservableList<CustomClass>中各id对应元素数量的方法
用Stream和Collectors统计自定义类集合的ID重复数量
代码实现
先给出CustomClass的基础定义(需包含获取id的方法):
public class CustomClass { private int id; private String name; public CustomClass(int id, String name) { this.id = id; this.name = name; } // 必须提供getId方法,用于提取分组键 public int getId() { return id; } public String getName() { return name; } }
针对已填充数据的ObservableList<CustomClass>,用Stream+Collectors完成统计的代码如下:
ObservableList<CustomClass> customList = ...; // 你的目标数据集合 Map<Integer, Long> idCountMap = customList.stream() .collect(Collectors.groupingBy( CustomClass::getId, // 按CustomClass的id作为分组依据 Collectors.counting() // 统计每个分组内的元素数量 ));
工作原理拆解
- Stream初始化:调用
customList.stream()将ObservableList转换为Stream对象,Stream提供函数式元素处理能力,无需手动编写循环遍历逻辑。 - 分组逻辑:
Collectors.groupingBy是核心收集器,第一个参数CustomClass::getId是方法引用,作用是从每个CustomClass实例中提取id值作为Map的key。Stream会自动遍历所有元素,将相同id的元素归为同一组。 - 统计逻辑:第二个参数
Collectors.counting()是下游收集器,负责对每个分组内的元素数量进行计数,计数结果作为Map对应的value(类型为Long)。 - 结果整合:
collect方法会将分组和统计的结果最终组装成Map<Integer, Long>,直接得到每个id对应的元素总数。
对比手动遍历实现
Stream方式属于声明式编程,你只需要明确“按id分组并统计数量”的需求,无需手动维护Map的初始化、计数累加等细节,代码更简洁易读,也减少了出错的可能。
内容的提问来源于stack exchange,提问作者VMaties
相关产品推荐
相关产品推荐

