objects::isnull比e -> e == null更合适,因其语义明确、类型安全、零开销且避免手误;适用于引用类型流,需导入java.util.objects。

可以直接用 Objects::isNull 作为方法引用传递给 filter(),让意图更清晰——比写 e -> e == null 更简洁、语义更明确。
为什么 Objects::isNull 比手动写 lambda 更合适
它把“判断是否为空”这个意图直接暴露在代码中,而不是藏在匿名逻辑里。Java 标准库已为你封装好空值判断逻辑,无需重复造轮子,也避免手误(比如写成 e != null 反向逻辑)。
- 语义直白:一看就知道是过滤掉 null 元素
- 类型安全:编译器能推断泛型,不会出现类型擦除导致的隐患
- 零额外开销:底层就是
== null,无性能损失
常见使用场景示例
假设你有一个可能含 null 的字符串列表:
List<string> list = Arrays.asList("a", null, "b", null, "c");</string>
过滤掉 null 元素:
list.stream().filter(Objects::nonNull).collect(Collectors.toList()); // 保留非空
反过来,只保留 null:
list.stream().filter(Objects::isNull).collect(Collectors.toList()); // 只留 null
注意:Objects::isNull 和 Objects::nonNull 是一对互补方法引用,按需选用。
和传统写法对比更直观
下面三行效果等价,但可读性逐级提升:
-
filter(e -> e == null)—— 基础但略显低层 -
filter(Objects::isNull)—— 语义明确,推荐 -
filter(Objects::isNull).map(ignored -> "NULL")—— 后续操作也更易理解
尤其在复杂流链中(如多级 filter + map + flatMap),统一用标准方法引用能让整条流水线意图一目了然。
注意事项
Objects::isNull 是静态方法引用,要求入参类型与泛型一致。如果流中元素是原始类型包装类(如 Integer),它依然适用;但若流是 int 基本类型流(IntStream),则不能用——因为基本类型不可能为 null,该方法不适用。
- 只用于引用类型流(
Stream<t></t>,其中T是类类型) - 确保导入
java.util.Objects - 不要和
Optional.isPresent()混用——后者是针对 Optional 的判空,语义不同
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











