Objects.isNull() 适合配合 anyMatch 使用,因其是纯函数、仅做 null 判断且支持短路;正确写法为 list.stream().anyMatch(Objects::isNull),既安全又语义清晰。

直接在 Stream.anyMatch() 中用 Objects.isNull() 检测集合中是否存在 null 元素,是简洁且安全的做法。关键在于:别对元素本身调用方法(避免空指针),而是把 Objects.isNull 作为谓词函数传入。
为什么 Objects.isNull() 适合配合 anyMatch 使用
Objects.isNull(obj) 是一个纯函数,内部只做 obj == null 判断,不触发任何方法调用,因此完全规避了 NullPointerException。它和 anyMatch 天然契合——后者只要找到一个匹配项就立即返回 true,短路高效。
基本写法:检测 List 中是否有 null 元素
假设你有一个 List<string></string>,想快速知道里面是否含 null:
- ✅ 正确(推荐):
list.stream().anyMatch(Objects::isNull) - ❌ 错误(会 NPE):
list.stream().anyMatch(s -> s.equals("abc"))(若 s 为 null) - ⚠️ 冗余:
list.stream().anyMatch(s -> s == null)(功能等价但不如Objects::isNull语义清晰)
进阶场景:检测对象字段是否为 null
如果集合中是自定义对象,需检查某个字段是否为 null,依然要避免解引用风险:
立即学习“Java免费学习笔记(深入)”;
- ✅ 安全写法:
list.stream().anyMatch(obj -> Objects.isNull(obj.getName())) - ✅ 更健壮(防 obj 本身为 null):
list.stream().anyMatch(obj -> obj != null && Objects.isNull(obj.getName())) - ❌ 危险写法:
list.stream().anyMatch(obj -> obj.getName() == null)(当obj为null时抛异常)
替代方案对比:Optional 或传统循环?
不用 Stream 也能做,但各有取舍:
-
for (String s : list) { if (s == null) return true; }—— 性能略优,但代码长、不够函数式 -
list.contains(null)—— 对ArrayList是 O(n),对LinkedList也是遍历,语义直观但不可控中断逻辑 -
Optional.ofNullable(list).map(l -> l.stream().anyMatch(Objects::isNull)).orElse(false)—— 过度包装,无必要
所以,stream().anyMatch(Objects::isNull) 在可读性、安全性、性能之间取得了很好平衡。


















