构造函数参考
构造函数引用与方法引用相同,只是方法名称为new
。例如,Button::new
是类的构造函数引用Button
。将调用哪个构造函数取决于上下文。想象一下,您想要将字符串列表转换为按钮数组。在这种情况下,您应该在每个字符串上调用构造函数。它可能是这样的:
List strs = …;
Stream stream = strs.stream().map(Button::new);
List buttons = stream.collect(Collectors.toList());
有关stream
的更多信息,您可以查看文档。在这种情况下,最重要的是该方法为每个列表元素调用构造函数。有多个构造函数,但编译器选择带有参数的构造函数,因为从上下文中可以明显看出应该调用带有字符串的构造函数。map``collect``map``Button(String)``Button``String
还可以为数组类型创建构造函数引用。例如,int
数组的构造函数引用是int[]::new
。它需要一个参数:数组的长度。它等同于lambda表达式x -> new int[x]
。
数组的构造函数引用对于超越Java的限制很有用。创建泛型类型的数组是不可能的T
。表达式new T[n]
不正确,因为它将替换为new Object[n]
。对于图书馆作者来说这是一个问题。想象一下,我们想拥有一系列按钮。有一种方法toArray
在类Stream
返回的数组Object
:
Object[] buttons = stream.toArray();
但那不是你想要的。用户不想要Objects
,只有按钮。该库使用构造函数引用解决了这个问题。你应该传递Button[]::new
给方法toArray
:
Button[] buttons = stream.toArray(Button[]::new);
该toArray
方法调用此构造函数以获取所需类型的数组,然后在填充后返回此数组。
可变范围
通常,您希望从lambda表达式中的封闭范围访问变量。考虑以下代码:
public static void repeatText(String text, int count) {
Runnable r = () -> {
for (in