You need to enable JavaScript to run this app. Java中基于itemTypeId统计ArrayList中Item数量(含Stream写法报错)
优惠活动
大模型
产品
解决方案
定价
更多

Java中基于itemTypeId统计ArrayList中Item数量(含Stream写法报错)

统计ArrayList中指定itemTypeId的Item实例数量

之前代码的报错原因拆解

  • 第一段用equals的报错:Item类的getItemTypeId()方法返回值是基本数据类型int,基本类型不属于类,没有绑定任何方法,自然不存在equals()可调用,编译器直接识别报错。另外哪怕你把返回值改成Integer包装类,后续链路里.collect(Collectors.toList())会返回List<Item>类型的结果,和要赋值的Integer变量类型完全不匹配,根本编译不过。
  • 第二段用==的写法问题:你对==比较整数的顾虑是场景误解——当==两侧都是基本类型int时,直接比较字面值是完全合法可靠的,语法上没有问题。但同样的核心问题是,最后用collect(Collectors.toList())收集成List对象,类型和quantityOfTypeOne的Integer类型不匹配,无法直接赋值。

补充提醒:你示例代码里的初始化new Array<>()、调用push()添加元素的写法存在笔误,标准的ArrayList初始化是new ArrayList<Item>(),添加元素用add()方法即可,不影响后续的统计逻辑。

正确实现方式

流处理写法(Java 8+支持)

不需要把过滤后的结果收集成List,直接调用流的count()方法统计匹配元素的数量即可:

// 因为getItemTypeId()返回int,和字面量1用==比较没有任何问题
Integer quantityOfTypeOne = (int) items.stream()
    .filter(item -> item.getItemTypeId() == 1)
    .count();

注意:count()方法返回值是long类型,强转成int即可自动装箱为Integer类型完成赋值。

传统循环写法(兼容所有JDK版本)

如果不想用Stream,用增强for循环直接遍历计数是最直观、无额外依赖的写法:

int quantityOfTypeOne = 0;
for (Item item : items) {
    if (item.getItemTypeId() == 1) {
        quantityOfTypeOne++;
    }
}

常见误区澄清

大家常说“整数比较不要用==要用equals”,这个规则仅适用于两个Integer包装类对象的比较场景;如果参与比较的是基本类型int,用==比较字面值是Java语言的标准用法,不存在任何可靠性问题。

内容的提问来源于stack exchange,提问作者PositiveGuy

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.11.05 22:06:10