方法引用通过::符号复用已有方法替代lambda表达式,提升简洁性与可读性,分为对象实例方法、静态方法、类实例方法和构造器引用四种形式,需严格匹配函数式接口签名。

方法引用通过复用已有方法,直接替代 Lambda 表达式中重复的逻辑,让参数传递更简洁、可读性更强。
方法引用的核心作用是消除冗余
当 Lambda 表达式只是调用一个已存在的方法(比如 System.out.println(s)),再写一遍 s -> System.out.println(s) 就属于重复劳动。方法引用用 :: 符号把目标方法“拎出来”直接用,语义更明确,代码更短。
- Lambda 写法:list.forEach(s -> System.out.println(s))
- 方法引用写法:list.forEach(System.out::println)
- 两者行为完全一致,但后者不写参数、不写箭头、不写方法调用括号,靠编译器自动匹配签名
方法引用有四种常见形式
取决于被引用方法的所属主体和参数结构,Java 支持以下写法:
-
对象名::实例方法名 —— 如
str::toLowerCase(str 是 String 实例) -
类名::静态方法名 —— 如
Objects::isNull -
类名::实例方法名 —— 如
String::length(第一个参数自动作为调用主体) -
类名::new —— 用于构造器引用,如
ArrayList::new
必须满足函数式接口的抽象方法签名
方法引用不是万能的,它能用的前提是:被引用方法的参数类型、个数、返回值,与函数式接口中抽象方法的定义严格匹配(或可通过类型推导对齐)。
- 例如
Function<string integer></string>要求一个入参、一个出参 → 可用String::length(String 入参,int 出参) - 但不能用
System.out::println,因为它的返回类型是 void,不满足 Function 的返回要求 - 此时应换用
Consumer<string></string>接口,它接受一个参数、无返回值
实际传参时,参数由调用方自动注入
方法引用本身不显式写参数,参数由接收它的上下文(比如 forEach、map、filter)按需提供。
-
list.stream().map(String::toUpperCase):stream 中每个元素自动作为toUpperCase()的调用主体 -
Arrays.sort(arr, Integer::compareTo):sort 方法内部会把两个 int 元素传给compareTo静态方法 - 不需要手动写
(a, b) -> a.compareTo(b),编译器根据接口定义完成绑定
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











