不能直接用 object::nonnull,因为 object 类中不存在 nonnull 方法,正确写法是 objects::nonnull;objects.nonnull 是 java.util.objects 中的静态方法,符合 predicate 接口要求,可用于 stream.filter 过滤 null 元素。

Java 中不能直接用 Object::nonNull 作为方法引用配合 filter 来过滤空元素,因为 Object::nonNull 不是一个合法的方法引用形式——它既不是静态方法、也不是实例方法或构造器引用,而是 Objects.nonNull 的误写或混淆。
正确写法是使用 Objects::nonNull
Objects.nonNull 是 java.util.Objects 类中的一个静态方法,签名是:
它接收一个 Object 参数并返回 boolean,完全符合 Predicate<t></t> 函数式接口的要求,因此可以安全用于 filter。
常见用法示例
比如对一个字符串列表过滤掉 null 元素:
List<string> list = Arrays.asList("a", null, "b", null, "c");
List<string> filtered = list.stream()
.filter(Objects::nonNull)
.collect(Collectors.toList());
// 结果:["a", "b", "c"]
</string></string>
为什么不能写成 Object::nonNull?
-
Object类中没有nonNull方法,编译会直接报错:「cannot find symbol」 -
Objects(注意末尾有 s)才是提供该工具方法的类,且是静态方法,所以引用格式为Objects::nonNull - 方法引用必须指向真实存在的、可访问的成员;拼错类名或方法名都会导致编译失败
替代写法(不推荐,仅作对比)
你也可以用 Lambda 表达式等价写出:
.filter(x -> x != null)
但 Objects::nonNull 更语义清晰、可读性更好,也统一了空值判断逻辑(尤其在内部还做了防 NPE 的额外处理时)。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











