不能直接用 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 元素:
立即学习“Java免费学习笔记(深入)”;
List<String> list = Arrays.asList("a", null, "b", null, "c");
List<String> filtered = list.stream()
.filter(Objects::nonNull)
.collect(Collectors.toList());
// 结果:["a", "b", "c"]
为什么不能写成 Object::nonNull?
-
Object类中没有nonNull方法,编译会直接报错:「cannot find symbol」 -
Objects(注意末尾有 s)才是提供该工具方法的类,且是静态方法,所以引用格式为Objects::nonNull - 方法引用必须指向真实存在的、可访问的成员;拼错类名或方法名都会导致编译失败
替代写法(不推荐,仅作对比)
你也可以用 Lambda 表达式等价写出:
.filter(x -> x != null)
但 Objects::nonNull 更语义清晰、可读性更好,也统一了空值判断逻辑(尤其在内部还做了防 NPE 的额外处理时)。


















