java方法引用是lambda表达式的精简写法,分四类:静态引用(类名::方法名)、实例引用(对象::方法名)、任意对象引用(类名::方法名)和构造引用(类名::new),需严格匹配函数式接口的参数与返回值类型。

Java 方法引用不是新概念,而是 Lambda 表达式的“精简写法”——当你的 Lambda 只是调用一个已有方法,且参数、返回值完全匹配时,就可以用 :: 替代整个箭头结构。答百问,核心就抓四点:它是什么、怎么写、为什么能用、哪里容易错。
静态方法引用:类名::方法名
最直观的一种。被引用方法必须是 static,且形参个数、类型、顺序,以及返回值,要和函数式接口的抽象方法严格一致。
-
常见例子:
Integer::parseInt对应Function<string integer></string>;String::valueOf对应Function<object string></object> -
注意点: 不是所有带 static 的方法都能直接用——比如
Math.abs(int)只接受 int,就不能用于Function<double integer></double> -
误用典型: 写成
new Date()::toString是错的,这是实例方法,不是静态引用
对象实例方法引用:对象::方法名
引用某个具体对象的实例方法。这个对象在引用时必须已存在,且方法非 static。
-
经典写法:
System.out::println——System.out是 PrintStream 实例,println是它的实例方法 -
自定义场景:
StringProcessor processor = new StringProcessor(); list.map(processor::format) -
关键限制: 不能在静态上下文中用
this::method,因为静态方法里没有this
任意对象的实例方法引用:类名::方法名
最容易混淆但高频使用的一种。它不指向某个具体对象,而是表示“让流中每个元素自己调用该方法”。
-
本质等价于:
String::length⇔s -> s.length(),其中s是 Stream 中的每个 String 元素 -
适用前提: 方法签名必须和函数式接口匹配——
String::toLowerCase可用于Function<string string></string>,但不能用于Consumer<string></string>(返回值类型不符) -
反例:
Object::toString在map中可用,在forEach中若接口要求 void 返回则不可用
构造方法与数组构造器引用
用 ClassName::new 或 Type[]::new 表示构造行为,本质是把“创建对象”或“创建数组”当作函数来传递。
-
普通构造:
ArrayList::new对应Supplier<list>></list>或Function<integer list>></integer>(取决于构造器参数) -
带参构造:
BigDecimal::new可用于Function<string bigdecimal></string>,因为有BigDecimal(String)构造器 -
数组构造:
int[]::new对应IntFunction<int></int>,常用于Stream.generate()或初始化固定长度数组
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











