方法引用是JDK8的一个新的特性,Lambda是用来简化匿名代码的书写格式的,而方法引用是用来进一步简化Lambda表达式的,它简化的更加过分。

方法引用有:

  • 静态方法引用
  • 实例方法引用
  • 特殊类型的方法引用
  • 构造方法引用

其中使用场景会比较多的是前两个,后面的两个倒是不怎么常见。

静态方法引用

使用场景

当别人提前写好的功能放在了一个静态方法中的时候,可以采用这种语法;

语法格式

类名::方法名

实例方法引用

使用场景

当别人提前写好的功能放在了一个成员方法中的时候,可以采用这种语法;

语法格式

对象::方法名

静态&实例方法引用代码案例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
// 接口A
public interface A {
void abc(String s);
}

// 已经被别人实现的类zhangsan
public class Zhangsan {
public static void printString(String s){
System.out.println("静态方法引用执行了!"+s);
}
public void printString2(String s){
System.out.println("实例方法引用执行了!"+s);
}

}


// 测试类
/*
方法引用:这件事情,已经被别人做过了,因此我们可以告诉Lambda,让他参考已经做过的类中的方法即可
*/
public class Test {
public static void main(String[] args) {
// 作为show方法的调用者,需要准备两个实际参数
show("aabbcc", Zhangsan::printString);

// 提前创建一个张三对象
Zhangsan zs = new Zhangsan();
show("aabbccdd", zs::printString2);

// 引用System类中的err对象中的println方法干活
show("aabbccddee", System.err::println);
}
public static void show(String s, A a){
a.abc(s);
}
}

特定类型的方法引用

使用场景

如果某个Lambda表达式里只是调用一个实例方法,并且前面的参数列表中的第一个参数是作为方法的主调,后面所有的参数都是作为该实例方法的入参, 此时就可以使用特定类型的方法引用

语法格式

类型::方法

代码案例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
// 接口A
public interface A {
boolean abc(String s1, String s2);
}

// 测试类Test
public class Test {
public static void main(String[] args) {
// 第三个参数本来是要写Lambda表达式的,但是使用了特殊方法的引用代替了,
show("aa", "bb", String::equals);
}
public static void show(String s1, String s2, A a){
boolean res = a.abc(s1, s2);
System.out.println(s1 + "和" + s2 +"比较结果是:" + res);
}
}

构造方法引用

使用场景

如果某个Lambda表达式里只是在创建对象,并且前后参数情况一致,就可以使用构造器引用。

语法格式

类名::new

代码案例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
// 接口A
public interface A {
Student newStu(String name);
}

// 学生实体类JavaBean
public class Student {
private String name;

public String getName() {
return name;
}

public void setName(String name) {
this.name = name;
}

public Student(String name) {
this.name = name;
}

@Override
public String toString() {
return "Student{" +
"name='" + name + '\'' +
'}';
}
}

// 测试类Test
public class Test {
public static void main(String[] args) {
// 正常的写法
show("李四", name -> new Student(name));
// 使用构造方法引用后的方法
show("李四", Student::new);
}
public static void show(String name, A a){
Student student = a.newStu(name);
System.out.println("学生对象" + student);
}
}