jdk8-1.1-方法引用:lambda表达式的语法糖

方法应用其实是 jdk 8 中的对于 lambda 表达式给予的一种 语法糖

而方法引用一共分为 4 种;

  • 1 类名::静态方法名
  • 2 对象名::方法名
  • 3 类名::实例方法名
  • 4 构造方法引用::new

我们有intellj 编写 lambda 表达式的时候,编译器总是标黄来告诉你,这里可以使用方法引用的方法来进行代码的简化

image_1b7k0qtepmls15v3rjv19691om39.png-86kB

而方法引用,method reference 其实就是lambda表达式一种语法糖
但是

不是所有的 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
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
public static void main(String[] args) {
// 第一种
Student student1 = new Student("zhumin1",10);
Student student2 = new Student("zhumin2",20);
Student student3 = new Student("zhumin3",40);
Student student4 = new Student("zhumin4",80);
List<Student> students = Arrays.asList(student1, student2, student3, student4);
// jdk 1.8 的新方法 List 中新增加了 sort 方法
// 传统的 lambda 表达式
students.sort((studentP1, studentP2) -> Student.compareByScore(studentP1, studentP2));
// 第一种方法引用的方式 类名::静态方法名
// 不需要传参数,因为可以自动推断出 Student 类型
students.sort(Student::compareByScore);
// 第二种 对象名称::方法名称
// 其实和第一种很类似
StudentComparator studentComparator = new StudentComparator();
students.sort((studentP1, studentP2) -> studentComparator.comparator(studentP1, studentP2));
// 对象名称::方法名称 (方法引用的第二种方式)
students.sort(studentComparator::comparator);
// 第三种方法 类名::实例方法
/**
* 比较难理解的的地方是,你会看到调用的函数,和 lambda 表达式需要的参数个数不一致, 会少一个
* 而且类名是没法调用方法名的
* 而理解方式是:调用方法的实例,就是传入lambda 表达式的第一个参数,而剩下所有参数,都作为 调用的实例方法 的参数
* 我们看下面的例子 , Student 类调用的是其的实例方法 compare(Student) 只有一个参数
* 而 List 的默认方法需要的 Comparator 的函数式接口需要两个参数,看似对应不上,而且,类名也无法调用实例方法
* 实际是,传入的第一参数就是 comare(student)这个函数的调用者,而第二个参数以及后续所有的参数(如果有跟多也是一样),是作为实例方法的参数传入
* 所以少一个参数也没什么
* 而更为关键的是这个就是一个语法糖,为了简化代码而生。理解就好
* 如此一来; 这个第三种方式就很好理解了
*
* 类名::实例方法
* 即 lambda 表达式的第一参数就是 实例方法 的调用者,后续所有的参数就是 实例方法的传入参数
*/
students.sort(Student::compare);
// 再看一个例子
List<String> cities = Arrays.asList("haha","lala","nihao","memeda");
// 对比二者
Collections.sort(cities, (city1, city2) -> city1.compareToIgnoreCase(city2));
Collections.sort(cities, String::compareToIgnoreCase);
// 对于第四种,构造方法引用,对于带参数和不带参数的都可以,编译器会自动的进行腿短
MethodRefrenceTest methodRefrenceTest = new MethodRefrenceTest();
// 点击 new 看看会跳到那个方法里去
methodRefrenceTest.getName(String::new);
// 点击 new 看看会跳到那个方法里去
methodRefrenceTest.getName2("haa", String::new);
}
public String getName(Supplier<String> supplier) {
return supplier.get() + "haha";
}
public String getName2(String name, Function<String ,String> stringFunction) {
return stringFunction.apply(name);
}
朱老师&敏哥 wechat
有惊喜,朋友🙄
我要拿铁不加糖.