文章目录
158. Java Lambda 表达式 - 构造函数方法引用的使用与实践
构造函数方法引用 是一种特殊的方式,它允许通过引用构造函数来创建对象。这种方法引用的语法与其他方法引用略有不同,因为构造函数本身并不是一个普通的方法,但我们依然可以通过方法引用来调用它。
1. 构造函数方法引用概述
构造函数方法引用是一种特殊的引用类型,它允许你直接引用类的构造函数。构造函数方法引用的基本语法如下:
ClassName::new
这种方式与普通方法引用类似,但由于构造函数不是普通的方法,所以它属于构造函数方法引用。
2. 基本示例
假设你有以下 Supplier
示例,它是一个返回空 ArrayList
的 lambda 表达式:
Supplier<List<String>> newListOfStrings = () -> new ArrayList<>();
这个 lambda
表达式可以被视为对 ArrayList
空构造函数的引用,你可以通过构造函数方法引用来简化它:
Supplier<List<String>> newListOfStrings = ArrayList::new;
在这个例子中,ArrayList::new
是构造函数方法引用,它引用了 ArrayList
类的空构造函数。这种写法简洁且清晰。
3. 使用菱形运算符与泛型类型
如果你想在构造函数方法引用中使用类型参数(比如使用泛型),你可以显式地提供类型参数。示例如下:
Supplier<List<String>> newListOfStrings = ArrayList<String>::new;
在这个例子中,ArrayList<String>::new
明确指定了 ArrayList
的类型为 String
。这里不需要使用菱形运算符,因为类型已经通过构造函数方法引用提供。
4. 构造函数方法引用的应用
构造函数方法引用通常用于需要生成对象的场景。比如在使用 Supplier
或者某些方法需要返回对象的场合。
考虑以下两个不同的构造函数引用示例:
空构造函数引用:
Supplier<List<String>> newListOfStrings = ArrayList::new;
这是一个常见的构造函数引用,用于创建一个新的空
ArrayList
。带参数构造函数引用:
Function<Integer, List<String>> newListOfNStrings = size -> new ArrayList<>(size);
这是另一个例子,使用了带参数的构造函数。这里
new ArrayList<>(size)
使用了一个带大小参数的构造函数来创建一个指定大小的ArrayList
。
你可以看到,虽然两者都使用了相同的构造函数方法引用 ArrayList::new
,但是它们指向的是不同的构造函数(一个是空构造函数,另一个是带有大小参数的构造函数)。
5. 构造函数方法引用的语法总结
构造函数方法引用的语法通常有以下几种形式:
空构造函数:
ClassName::new
这种方法引用用于调用类的空构造函数。带参数的构造函数:
ClassName::new
带参数的构造函数方法引用通常与Function
或其他类型的函数接口结合使用,传递参数给构造函数。
6. 示例:使用构造函数方法引用
创建空列表:
Supplier<List<String>> newListOfStrings = ArrayList::new; List<String> list = newListOfStrings.get(); // 创建一个空的 ArrayList
创建带大小参数的列表:
Function<Integer, List<String>> newListOfNStrings = ArrayList<String>::new; List<String> list = newListOfNStrings.apply(10); // 创建一个大小为 10 的 ArrayList
在这两个示例中,newListOfStrings
和 newListOfNStrings
都使用了构造函数方法引用,但它们引用的是不同的构造函数:一个是 ArrayList
的空构造函数,另一个是带有大小参数的构造函数。
7. 构造函数方法引用与普通方法引用的区别
普通方法引用:用于引用类的普通实例方法或静态方法。
例如:
Function<String, Integer> toLength = String::length;
构造函数方法引用:专门用于引用构造函数,语法上有所不同,因为构造函数是用于创建对象的。
例如:
Supplier<List<String>> newListOfStrings = ArrayList::new;
8. 注意事项
- 构造函数方法引用和普通方法引用类似,但你需要小心区分它们的使用场景,特别是在需要通过构造函数创建对象时。
- 确保你清楚构造函数引用指向的是哪个构造函数,特别是当构造函数有多个重载时。
练习
将以下代码转换为构造函数方法引用:
Supplier<StringBuilder> stringBuilderSupplier = () -> new StringBuilder();
答案:
Supplier stringBuilderSupplier = StringBuilder::new;
2. 将以下代码转换为构造函数方法引用:
```java
Function<Integer, List<Integer>> listSupplier = size -> new ArrayList<>(size);
答案:
Function<Integer, List<Integer>> listSupplier = ArrayList<Integer>::new;
总结
- 构造函数方法引用 提供了一种简洁的方式来引用类的构造函数,用于创建对象。
- 使用构造函数方法引用时,需要理解构造函数的参数,并确保方法引用指向正确的构造函数。
- 构造函数方法引用可以与
Supplier
、Function
等接口结合使用,帮助我们更清晰地创建对象。