方法引用不能直接实现集合属性过滤,它只是Lambda表达式的简化写法,真正过滤由Stream.filter()配合Predicate完成;常用于构造谓词以提升可读性,但要求方法签名必须匹配Predicate接口。

Java 中方法引用本身不能直接实现集合属性过滤,它只是 Lambda 表达式的简化写法,真正完成过滤的是 Stream.filter() 配合谓词(Predicate)。方法引用常用于构造这个谓词,让代码更简洁、可读性更强。
用方法引用代替 Lambda 写属性判断
假设有一个 Person 类,含 name 和 age 字段。要筛选出年龄大于 18 的人,传统 Lambda 写法是:
list.stream().filter(p -> p.getAge() > 18).collect(Collectors.toList());
如果已有现成的静态或实例方法能表达该逻辑,就可以用方法引用替代。比如定义一个工具方法:
立即学习“Java免费学习笔记(深入)”;
public static boolean isAdult(Person p) { return p.getAge() >= 18; }
那么过滤可简化为:
Java Maven 项目审查工作流的通用输入处理。当 Java Maven 项目以 ZIP压缩包或 GitLab 仓库 URL 形式提供且需要...时使用。
list.stream().filter(MyUtils::isAdult).collect(Collectors.toList());
用引用实例方法过滤特定属性值
若想按某个属性是否为空、是否匹配字符串等过滤,可借助对象自身方法。例如过滤姓名非空的人员:
list.stream().filter(p -> p.getName() != null && !p.getName().trim().isEmpty())- 可改写为:
list.stream().filter(p -> Optional.ofNullable(p.getName()).map(String::isBlank).orElse(true)).negate()(稍复杂) - 更实用的是提前封装:定义
Person::hasName实例方法,再写list.stream().filter(Person::hasName)
结合构造器引用与属性提取做间接过滤
方法引用不直接“过滤”,但可配合 map 提取属性后二次判断。例如只保留有邮箱的用户,并提取邮箱列表:
list.stream() .map(Person::getEmail) .filter(Objects::nonNull) .filter(email -> email.contains("@")) .collect(Collectors.toList());
这里 Person::getEmail 是方法引用,用于提取;后续两个 filter 才是实际过滤逻辑。
注意边界:不是所有场景都适合方法引用
方法引用要求目标方法签名必须匹配 Predicate<t></t>(即接收一个参数、返回 boolean)。常见误用包括:
- 试图写
list.stream().filter(Person::getAge > 18)—— 语法错误,getAge返回 int,不返回 boolean - 用
String::startsWith时漏传参数:正确写法是p -> p.getName().startsWith("A"),无法直接写成方法引用,除非用name -> name.startsWith("A")并提取为MyPredicates::startsA
本质上,方法引用是“借已有方法来充当函数式接口实例”,它简化的是函数定义,不是过滤动作本身。

















