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
相关产品推荐
相关产品推荐

