java stream的count、max、min是短路不生效的终端操作:count返回long型总数(空流得0);max/min需comparator并返回optional,须安全解包;均需遍历全流,大数据量时慎用。

Java Stream 的 count、max 和 min 是常用终端操作,用于快速获取元素数量或最值。它们都返回 long 或 Optional 类型,需注意空流处理。
用 count 统计元素个数
count() 是最简单的聚合操作,返回 long 类型的元素总数,无需判空,空流也安全返回 0。
- 直接调用即可:
long n = list.stream().count(); - 不能链式调用其他中间操作(因为是终端操作),执行后流就关闭了
- 若只需判断是否非空,用
findAny().isPresent()或anyMatch(x -> true)更高效,避免遍历全部元素
用 max 和 min 获取极值
max(Comparator) 和 min(Comparator) 返回 Optional<t></t>,必须传入比较器,否则编译不通过。空流会返回空的 Optional,需主动处理。
你接手一个需求时,是不是经常这样:"改一个小字段 → 结果把不相关的代码也改了"、"需求说得很模糊 → 做着做着发现跑偏了"、"数据库加个字段 → 上线才发现漏了数据兼容"、"做了个新功能 → 一个月后自己都忘了当时怎么设计的"、"写到一半被中断 → 再回来不知道从哪继续";这个 Skill 就是专门解决这些问题的。 它会自动探测你的项目环境(JDK、Spring Boot、ORM、数据库、前端框架),记在
- 对数字类型,可用
Integer::compareTo、Double::compareTo等方法引用 - 对自定义对象,需提供明确的比较逻辑,例如:
stream.max(Comparator.comparing(Person::getAge)) - 调用
.orElse(null)、.orElseThrow()或.ifPresent(...)安全解包结果
常见陷阱与注意事项
这三个操作都是**短路不生效的终端操作**:它们必须遍历整个流才能得出结果(count 要数完,max/min 要比完),无法像 findFirst 那样提前终止。
- 不要在大数据量的无限流(如
Stream.iterate)上直接调用,会导致无限循环 - 若已知集合有顺序且非空,用
list.get(0)和list.get(list.size()-1)比min/max快得多 - 数值计算场景中,若还需平均值、总和等,优先考虑
summaryStatistics(),一次遍历获取多个统计值
简单示例代码
假设有一个整数列表:
List<integer> nums = Arrays.asList(3, 1, 4, 1, 5); long total = nums.stream().count(); // 5 Optional<integer> maxVal = nums.stream().max(Integer::compareTo); // Optional[5] Optional<integer> minVal = nums.stream().min(Integer::compareTo); // Optional[1] // 安全取值 int maxValue = maxVal.orElse(0); int minValue = minVal.orElse(0);</integer></integer></integer>
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










