Java 8中能否用Streams简化统计唯一商户代码数量的代码?
问题描述
我有一个包含Merchant对象的列表,对象包含Merchant Code、purchase ref等属性,示例数据如下:
1, purchase abc, description 1, purchase cde, descr 2 2, purachase fed, desc 4 3, purchase fij, desc 55
我的需求是统计唯一Merchant Code的数量,上述示例结果应为3。我当前的Java代码如下:
int numberOfUniqueMerchanCodes = myListOfMerchantRecords.stream() .collect(Collectors.groupingBy(t->t.getMerchantCode())).size();
由于我仅需统计唯一Merchant Code的数量,无需收集分组后的元素,请问能否简化这段代码?
简化方案
当然可以简化,你的当前写法会生成完整的分组Map,额外存储所有分组后的元素,对于只需要统计唯一值数量的场景,有更高效简洁的实现方式:
写法一:distinct() + count()(推荐)
long numberOfUniqueMerchantCodes = myListOfMerchantRecords.stream() .map(Merchant::getMerchantCode) .distinct() .count();
该写法直接通过map提取Merchant Code,distinct()去重后用count()统计数量,返回值为long类型。如果确定唯一数量不会超出int范围,可在末尾追加.intValue()转换为int。
写法二:Collectors.toSet()
int numberOfUniqueMerchantCodes = (int) myListOfMerchantRecords.stream() .map(Merchant::getMerchantCode) .collect(Collectors.toSet()) .size();
这种写法仅存储唯一的Merchant Code,相比原代码的groupingBy,避免了为每个Code维护对应元素列表的内存开销,同样能实现需求。
优化点说明
- 原代码的
groupingBy会为每个Merchant Code创建一个元素列表,数据量大时内存占用显著更高; - 两种简化写法仅聚焦于唯一的Merchant Code本身,无需额外存储关联对象,性能和内存利用率更优。
内容的提问来源于stack exchange,提问作者Loner shushman
相关产品推荐
相关产品推荐

