精通 Java 8 方法引用::: 语法与四大引用类型
方法引用语法
使用 :: 分隔类/对象与方法名,将方法作为值传递,替代单纯转发的 Lambda。
四大引用类型
| 类型 | 语法 | Lambda 等价形式 | 示例 |
|---|---|---|---|
| 静态方法引用 | ClassName::staticMethod | (args) -> ClassName.staticMethod(args) | Integer::parseInt |
| 实例方法引用(特定对象) | instance::method | (args) -> instance.method(args) | System.out::println |
| 实例方法引用(任意对象) | ClassName::method | (obj, args) -> obj.method(args) | String::compareToIgnoreCase |
| 构造器引用 | ClassName::new | (args) -> new ClassName(args) | ArrayList::new |
实战示例
1. 静态方法引用
List list = Arrays.asList("3", "1", "2");
list.sort(Integer::parseInt); // 等价 (a,b) -> Integer.parseInt(a) - Integer.parseInt(b) 但需注意语义
// 更准确:按数值排序
list.stream().map(Integer::parseInt).sorted().forEach(System.out::println);
2. 特定对象实例方法引用
List names = Arrays.asList("Mahesh", "Suresh", "Ramesh");
names.forEach(System.out::println); // 等价 name -> System.out.println(name)
3. 任意对象实例方法引用
String[] arr = {"Bob", "Alice", "Charlie"};
Arrays.sort(arr, String::compareToIgnoreCase); // (a,b) -> a.compareToIgnoreCase(b)
4. 构造器引用
// 无参构造
Supplier> supplier = ArrayList::new;
List list = supplier.get();
// 有参构造(函数式接口参数匹配)
Function> listFactory = ArrayList::new; // 需 ArrayList 有 String 构造器,实际无,仅示意
// 正确示例:
Function arrayFactory = int[]::new;
int[] arr = arrayFactory.apply(5); // new int[5]
数组构造器引用
// 创建二维数组工厂
Function matrixFactory = String[]::new;
String[] row = matrixFactory.apply(3); // new String[3]
注意事项
- 重载方法引用需目标类型上下文确定(如赋值给具体函数式接口变量)。
- 构造器引用适配的函数式接口参数列表必须与构造器参数列表一致。
- 方法引用不创建新对象(除构造器引用),仅绑定现有方法,性能与直接调用相当。
java
- 精通 Java 运算符:类型、语法与实战示例
- 精通 Java 接口:概念、实现与最佳实践
- 精通 Java Try-With-Resources:自动资源管理详解
- Java 注解详解:类型、放置位置与实战示例
- Java 注解类型完全指南:预定义、自定义与元注解
- Java String length() 方法:获取字符串长度(示例)
- 精通 Java String.indexOf():定位子字符串与实战示例
- Java String.charAt() 详解:语法、返回类型、异常与实战示例
- 精通 Java String compareTo():语法、用例与实战示例
- Java String.contains() 方法:检查子字符串是否存在(实战示例)
- 精通 Java String.endsWith():检查字符串后缀(示例)
- Java 字符串替换大全:replace()、replaceAll() 与 replaceFirst() 详解