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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.05 00:42:11