概述

在使用Lambda表达式的时候,我们在方法体中所写的代码就相当于是一种解决方案:那所提供的参数,执行方法体中的代码。所以如果当时Lambda表达式的方法体中除了调用现有方法之外什么都不做,就使用其本来就已经存在的方案,这个时候我们就可以采用方法引用的书写方式。

实例方法引用

语法:对象 :: 实例方法

特点:在Lambda表达式的方法体中,通过“对象”来调用指定的某个“实例方法”。

什么是实例方法?

在Java中,实例方法是与对象实例相关联的方法。换句话说,它们是定义在类中的方法,必须通过类的实例(对象)来调用。实例方法可以访问和操作对象的属性,并且可以调用其他实例方法。

要求:函数式接口中抽象方法的返回值类型和形参列表内部通过对象调用某个实例方法的返回值类型和形参列表保持一致。

image-20240523153434086

1
2
Consumer<String> consumer = System.out::println;
consumer.accept("Hello World");
1
2
3
4
5
6
7
8
9
10
11
Teacher teacher = new Teacher("ande", 18);
Supplier<String> supplier1 = new Supplier<String>() {
@Override
public String get() {
return teacher.getName();
}
};
System.out.println(supplier1.get());
//简化后的代码
Supplier<String> supplier = teacher::getName;
System.out.println(supplier.get());

静态方法引用

语法:类 :: 静态方法

特点:在Lambda表达式的方法体中,通过“类名”来调用指定的某个“静态方法”。

什么是静态方法?

静态方法是与类相关联而不是与对象实例相关联的方法,使用 static 关键字来声明

通过类名直接调用,无需创建类的实例

静态方法通常用于实现与类本身相关的功能,例如工具方法或者是与类的属性操作无关的功能

image-20240523153740679

1
2
3
4
5
6
7
8
9
10
11
12
public static void main(String[] args) {
Function<Double, Long> function1 = new Function<Double, Long>() {
@Override
public Long apply(Double aDouble) {
return Math.round(aDouble);
}
};
System.out.println(function1.apply(3.14));
//改写后
Function<Double, Long> function = Math::round;
System.out.println(function.apply(3.14));
}

特殊方法引用

语法:类名 :: 实例方法

特点:在Lambda表达式的方法体中,通过方法的第一个形参来调用指定的某个“实例方法”

要求:把函数式接口中抽象方法的第一个形参作为方法的调用者对象,并且从第二个形参开始(或无参)可以对应到被调用实例方法的参数列表中,并且返回值类型保持一致

image-20240523153832226

1
2
3
4
5
6
7
8
9
10
11
//特殊方法引用
Comparator<Double> comparator1 = new Comparator<Double>() {
@Override
public int compare(Double o1, Double o2) {
return o1.compareTo(o2);
}
};
System.out.println(comparator1.compare(10.0, 20.0));
//改写后
Comparator<Double> comparator = Double::compareTo;
System.out.println(comparator.compare(10.0, 20.0));

构造方法引用

语法:类名 :: new

特点:在Lambda表达式的方法体中,返回指定“类名”来创建出来的对象

要求:创建对象所调用构造方法形参列表和函数式接口中的方法的形参列表保持一致,并且方法的返回值类型和创建对象的类型保持一致

image-20240523153911942

1
2
3
4
5
6
7
8
9
10
Supplier<Teacher> supplier1 = new Supplier<Teacher>() {
@Override
public Teacher get() {
return new Teacher();
}
};
System.out.println(supplier1.get());

Supplier<Teacher> supplier = Teacher::new;
System.out.println(supplier.get());

数组引用

语法:数组类型 :: new

特点:在Lambda表达式的方法体中,创建并返回指定类型的“数组”

要求:重写的方法有且只有一个整数型的参数,并且该参数就是用于设置数组的空间长度,并且重写方法的返回值类型和创建数组的类型保持一致。

1
2
3
4
5
6
7
8
9
10
Function<Integer, int[]> function12 = new Function<Integer, int[]>() {
@Override
public int[] apply(Integer integer) {
return new int[integer];
}
};
System.out.println(Arrays.toString(function12.apply(10)));

Function<Integer, int[]> function2 = int[]::new;
System.out.println(Arrays.toString(function2.apply(20)))