6.8.3 方法引用与构造器引用

6.8.3 方法引用与构造器引用

如果Lambda表达式的代码块只有一条代码,程序就可以省略Lambda表达式中代码块的花括号。
如果L ambda表达式的代码块只有一条代码,还可以在代码块中使用方法引用构造器引用

方法引用构造器引用可以让Lambda表达式的代码块更加简洁。方法引用和构造器引用都需要使用两个英文冒号

Lambda表达式的几种引用方式

种类 示例 说明 对应的Lambda表达式
引用类方法 类名::类方法 调用该类的类方法,并把函数式接口中被实现的抽象方法的全部参数传给该类方法作为参数 (a,b,...)->类名.类方法(a,b,…)
引用特定对象的实例方法 特定对象::实例方法 调用该对象的方法,并把函数式接口中被实现的抽象方法的全部参数传给该实例方法作为参数 (ab,…)->特定对象.实例方法(a,b,…)
引用某类对象的实例方法 类名::实例方法 函数式接口中被实现的抽象方法的第一个参数作为调用者,剩下的参数全部传给该实例方法作为参数 (ab,…)->a.实例方法(b,…)
引用构造器 类名::new 函数式接口中被实现的抽象方法的全部参数传给该构造器作为参数 (a,b,...)->new 类名(a,b,…)

1. 引用类方法

1
2
3
4
5
6
7
8
9
10
// 下面代码使用Lambda表达式创建Converter对象
Converter converter1 = from -> Integer.valueOf(from);
Integer value1 = converter1.convert("99");
System.out.println(value1); // 输出整数99

// 引用Integer类的valueOf类方法,
// 并将函数式接口Converter中的convert方法的参数from传递给valueOf方法作为参数
Converter converter2 = Integer::valueOf;
Integer value2 = converter2.convert("99");
System.out.println(value2); // 输出整数99

2. 引用特定对象的实例方法

1
2
3
4
5
6
7
8
9
10
11
String testStr = "HelloWorld";
String subStr = "World";
// 下面代码使用Lambda表达式创建Converter对象
Converter converter1 = from -> testStr.indexOf(from);
Integer value1 = converter1.convert(subStr);
System.out.println(value1);

// 引用Stringd对象的indexOf方法,indexOf方法的参数和Converter的convert方法的参数一样。
Converter converter2 = testStr::indexOf;
Integer value2 = converter2.convert(subStr);
System.out.println(value2);

3. 引用某类对象的实例方法

1
2
3
4
5
6
7
8
9
10
11
12
String testStr = "HelloWorld";
// 下面代码使用Lambda表达式创建MyTest对象
MyTest mt1 = (a, b, c) -> a.substring(b, c);
String str1 = mt1.test(testStr, 5, testStr.length());
System.out.println(str1);

// 引用String类的substring实例方法,
// 通过test方法的第一个参数来调用substring,
// test方法的剩余参数,传给substring方法
MyTest mt2 = String::substring;
String str2 = mt2.test(testStr, 5, testStr.length());
System.out.println(str2);

4. 引用构造器

1
2
3
4
5
6
7
YourTest yt1 = (String a) -> new JFrame(a);
JFrame jf1 = yt1.win("我的窗口");
System.out.println(jf1);
// 引用JFrame的构造器,以win方法的参数作为构造器的参数
YourTest yt2 = JFrame::new;
JFrame jf2 = yt2.win("我的窗口");
System.out.println(jf2);