java方法引用是lambda表达式的简化写法,本质是传递已有方法而非调用;其成立前提为:静态、特定对象实例、任意对象实例、构造器四类引用形式,必须与函数式接口抽象方法在参数数量、类型顺序及返回值上严格签名兼容。

先认准方法引用的四种基本形式
所有方法引用都写作 类名或对象 :: 方法名,但含义不同:
-
静态方法引用:如
Integer::parseInt→ 等价于(String s) -> Integer.parseInt(s) -
实例方法引用(特定对象):如
str::toLowerCase(str 是已存在的 String 对象)→ 等价于() -> str.toLowerCase() -
实例方法引用(任意类型):如
String::length→ 等价于(String s) -> s.length(),注意参数类型必须和调用目标一致 -
构造器引用:如
ArrayList::new→ 等价于() -> new ArrayList(),也可带参,如HashMap::new对应(int initialCapacity) -> new HashMap(initialCapacity)
重点看导图中“函数式接口与方法签名匹配”部分
方法引用能否成立,不看名字,只看参数数量、类型顺序、返回值是否与目标函数式接口抽象方法兼容。比如:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
-
Function<string integer></string>要求:1个 String 参数,返回 Integer →Integer::valueOf符合(String → Integer) -
Consumer<string></string>要求:1个 String 参数,无返回 →System.out::println符合(String → void) -
Supplier<list>></list>要求:无参,返回 List →ArrayList::new符合(() → ArrayList)
导图里容易被忽略的细节标注
优质导图通常会在分支旁加小图标或颜色标记:
- 标 ⚠️ 的地方:说明
System::currentTimeMillis是静态引用,但它的签名是() → long,只能用于Supplier<long></long>类型,不能塞进Runnable(后者无返回) - 标 ? 的地方:提醒
String::compareTo是双参数方法(String::compareTo实际等价于(s1, s2) -> s1.compareTo(s2)),适用于Comparator<string></string> - 标 ✅ 的地方:列出常用可直接用的方法引用,如
Math::abs、Objects::isNull、Arrays::sort(需注意重载歧义)
怎么看才不卡壳?三步定位法
拿到一张方法引用导图,别从头读到尾,按这个顺序扫:
- 先找你正在写的函数式接口(比如刚写了
.map(...),那目标就是Function) - 再看导图中对应接口分支下的“可用方法引用示例”列表
- 最后核对括号里的参数提示,比如
LocalDateTime::now (no args)vsLocalDateTime::parse (CharSequence)
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










