方法引用在optional中用于map、flatmap、filter、ifpresent等方法,简化lambda表达式:map转换值(如string::length),flatmap展平嵌套optional(如user::getaddress),filter筛选(如string::isempty),ifpresent触发副作用(如system.out::println)。

方法引用在处理 Optional 时,主要用在 map、flatMap、filter、ifPresent 等接受函数式接口参数的方法中,能显著简化 Lambda 表达式,让代码更简洁可读。
用 map 配合方法引用转换值
当 Optional 包含一个对象,你想调用它的某个方法获取新值(比如 String::length、User::getName),直接用方法引用替代冗长的 Lambda:
Optional<string> opt = Optional.of("hello");</string>Optional<integer> len = opt.map(String::length); // 返回 Optional[5]</integer>Optional<user> userOpt = Optional.of(new User("Alice")); </user>Optional<string> name = userOpt.map(User::getName); // 假设 getName() 返回 String</string>
注意:如果 Optional 为空,map 不执行方法引用,直接返回 Optional.empty(),不会 NPE。
用 flatMap 处理返回 Optional 的方法
当你要调用的方法本身返回 Optional(比如 getter 返回 Optional
),必须用flatMap,否则会嵌套成 Optional<optional>></optional>:
Optional<user> userOpt = Optional.ofNullable(getUser());</user>Optional<string> city = userOpt.flatMap(User::getAddress) // getAddress() 返回 Optional<address></address></string>.flatMap(Address::getCity); // getCity() 返回 Optional<string></string>
这里 User::getAddress 和 Address::getCity 都是方法引用,flatMap 自动展平结果,最终得到单层 Optional<string></string>。
Java Maven 项目审查工作流的通用输入处理。当 Java Maven 项目以 ZIP压缩包或 GitLab 仓库 URL 形式提供且需要...时使用。
用 filter 配合方法引用做条件筛选
filter 接收 Predicate,适合用对象的判断类方法(如 String::isEmpty、User::isActive):
Optional<string> opt = Optional.of("test");</string>Optional<string> nonEmpty = opt.filter(Predicate.not(String::isEmpty));</string>Optional<user> activeUser = userOpt.filter(User::isActive);</user>
如果值不存在或不满足条件,结果就是 Optional.empty();满足则原样返回。
用 ifPresent/ifPresentOrElse 触发副作用
当只想在值存在时执行某个操作(如打印、保存、更新状态),方法引用让意图更清晰:
opt.ifPresent(System.out::println); // 直接输出userOpt.ifPresent(User::logAccess); // 调用实例方法userOpt.ifPresentOrElse(User::notify, () -> log.warn("User missing")); // Java 9+
注意:方法引用必须是无参或单参(参数类型需与 Optional 内部类型匹配),且不能抛出受检异常。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










