如何使用Java Stream统计列表指定单词个数并返回int类型结果
基于Java Stream的空字符串计数实现
Stream.count() 设计为返回long类型,是为了适配超大容量集合、无限流的计数场景,规避int取值范围溢出的风险,想要得到int类型的返回值,只需要在计数环节做对应类型转换即可,完全可以替代原有的循环统计逻辑。
等价替换的Stream版工具方法
和原有循环实现逻辑完全一致的方法代码如下:
private static int getCountEmptyStringStream(List<String> strings) { return (int) strings.stream() .filter(element -> element.equals("")) .count(); }
其他可选的Stream实现方案
如果不想手动做强制类型转换,也可以选择下面两种等价写法,最终返回值天然就是int类型:
- 匹配项映射为数值1后求和:
private static int getCountEmptyStringStream(List<String> strings) { return strings.stream() .filter(element -> element.equals("")) .mapToInt(element -> 1) .sum(); } - 通过reduce累加维护计数器,和循环的累加逻辑思路高度对齐:
private static int getCountEmptyStringStream(List<String> strings) { return strings.stream() .reduce(0, (counter, element) -> element.equals("") ? counter + 1 : counter, Integer::sum); }
实用注意点
- 普通业务场景下,列表元素总数远小于int的取值上限(约21亿),直接将
count()的long返回值强转为int不会有数值风险,是最简洁的实现方式。 - 如果需要处理超大容量集合,建议用
Math.toIntExact()做转换,一旦计数结果超过int取值上限,方法会直接抛出ArithmeticException告警,避免返回溢出后的错误数值,示例写法:return Math.toIntExact(strings.stream().filter(""::equals).count()); - 提示:过滤条件可以用方法引用简写,把
element -> element.equals("")写为""::equals,代码更简洁,同时还能避免列表中存在null元素时,调用空对象的equals方法抛出空指针异常。
内容的提问来源于stack exchange,提问作者user3241026
相关产品推荐
相关产品推荐

