Java方法引用通过将已有方法作为值传递来提升代码重用性,包括静态方法引用(如Integer::parseInt)、实例方法引用(如System.out::println)、任意对象的实例方法引用(如String::toUpperCase)和构造方法引用(如ArrayList::new),实现逻辑复用、一处修改全局生效、行为稳定及创建逻辑统一。

Java 中利用方法引用提高代码重用性,核心在于把已有方法“当作值”来传递和复用,避免重复写逻辑相似的 Lambda 表达式。它不新增功能,而是让已有方法在不同上下文中被多次、一致地调用。
静态方法引用:复用工具类中的通用逻辑
当多个地方需要执行相同计算或转换(比如字符串转整数、数字平方),把逻辑封装在静态方法里,再用 类名::方法名 引用即可。
- 例如:
Integer::parseInt替代s -> Integer.parseInt(s),所有需要字符串转整型的地方都可直接复用 - 自定义工具方法也适用:
MathUtils::square可用于流处理、排序比较、条件映射等多个场景 - 好处是:一处修改(如加空值校验),所有引用位置自动生效
实例方法引用:绑定对象行为,避免重复创建操作器
对某个已存在的对象,将其方法作为可复用的行为单元传入函数式接口。
- 比如
System.out::println复用标准输出行为,替代x -> System.out.println(x) - 自定义对象如
printer::print,把一个打印机实例的打印能力“打包”后,在 forEach、map 等处反复使用 - 关键点:对象生命周期可控,行为稳定,无需每次新建匿名实现
任意对象的实例方法引用:复用类型共性操作
用 类名::实例方法名 形式,把某类对象的通用行为抽象为函数,适用于泛型处理。
立即学习“Java免费学习笔记(深入)”;
-
String::toUpperCase可用于任何字符串列表的转换,无需关心具体哪个字符串实例 -
Order::getId在 stream 的 map 中提取 ID,复用 Order 类自身的方法契约,比手写o -> o.getId()更简洁且不易出错 - 这种引用天然支持多态,若子类重写了该方法,运行时自动调用子类版本
构造方法引用:统一对象创建逻辑
用 类名::new 把对象构造过程抽象成可复用的工厂行为。
-
ArrayList::new可传给 Supplier,也可用于 Stream.collect 的 Collector 构造 - 配合泛型,如
HashMap::new或带参构造Person::new(需函数式接口匹配参数),让对象创建逻辑集中、可测试、易替换 - 便于后续切换实现(如换成
LinkedHashMap::new)而无需修改调用方
方法引用不是语法糖的炫技,它是把“做什么”和“怎么做”进一步解耦——让方法本身成为可传递、可组合、可替换的一等公民。只要方法签名匹配函数式接口,就能即插即用,重用性自然提升。


















