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 { 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
|