Java 方法引用

本文最后更新于:2024年3月18日 凌晨

Java 方法引用

  • 方法引用通过方法的名字来指向一个方法。
  • 如果除了方法名外,方法参数一致,返回类型相同,因此,我们说两者的方法签名一致,可以直接把方法名作为Lambda表达式传入。
  • 方法引用使用一对冒号::

实例

  • 因为Comparator<String>接口定义的方法是int compare(String, String),和静态方法int cmp(String, String)相比,除了方法名外,方法参数一致,返回类型相同,因此,我们说两者的方法签名一致,可以直接把方法名作为Lambda表达式传入。
1
2
3
4
5
6
7
8
9
10
11
public class Test {
public static void main(String[] args) {
String[] array = new String[] { "Apple", "Orange", "Banana", "Lemon" };
Arrays.sort(array, Test::cmp);
System.out.println(String.join(", ", array));
}

static int cmp(String s1, String s2) {
return s1.compareTo(s2);
}
}

方法引用的4种情况

  • 下面,我们在 Car 类中定义了 4 个方法作为例子来区分 Java 中 4 种不同方法的引用。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
@FunctionalInterface
public interface Supplier<T> {
T get();
}

class Car {
//Supplier是jdk1.8的接口,这里和lamda一起使用了。
public static Car create(final Supplier<Car> supplier) {
return supplier.get();
}

public static void collide(final Car car) {
System.out.println("Collided " + car.toString());
}

public void follow(final Car another) {
System.out.println("Following the " + another.toString());
}

public void repair() {
System.out.println("Repaired " + this.toString());
}
}
  • 构造器引用:它的语法是Class::new,或者更一般的Class< T >::new实例如下:
1
2
final Car car = Car.create( Car::new );
final List< Car > cars = Arrays.asList( car );
  • 静态方法引用:它的语法是Class::static_method,实例如下:
1
cars.forEach( Car::collide );
  • 特定类的任意对象的方法引用:它的语法是Class::method实例如下:
1
cars.forEach( Car::repair );
  • 特定对象的方法引用:它的语法是instance::method实例如下:
1
2
final Car police = Car.create( Car::new );
cars.forEach( police::follow );

方法引用实例

1
2
3
4
5
6
7
8
9
10
11
12
13
public class Java8Tester {
public static void main(String args[]){
List<String> names = new ArrayList();

names.add("Google");
names.add("Youtube");
names.add("Taobao");
names.add("Baidu");
names.add("Sina");

names.forEach(System.out::println);
}
}
  • 实例中我们将System.out::println方法作为静态方法来引用。
  • 执行以上脚本,输出结果为。
1
2
3
4
5
Google
Runoob
Taobao
Baidu
Sina