Java 8 方法引用
引言
在学习lambda表达式之后,我们通常使用lambda表达式来创建匿名方法。然而,有时候我们仅仅是调用了一个已存在的方法。如下:
Arrays.sort(stringsArray,(s1,s2)->s1.compareToIgnoreCase(s2));
在Java8中,我们可以直接通过方法引用来简写lambda表达式中已经存在的方法。
Arrays.sort(stringsArray, String::compareToIgnoreCase);
介绍
这种特性就叫做方法引用(Method Reference)。
方法引用通过方法的名字来指向一个方法。
方法引用可以使语言的构造更紧凑简洁,减少冗余代码。
方法引用使用一对冒号 ::
引用类型
方法引用的标准形式是:类名::方法名
。(注意:只需要写方法名,不需要写括号)
有以下四种形式的方法引用,用的最多的应该就是第三种:
类型 | 示例 |
引用静态方法 | ContainingClass::staticMethodName |
引用某个对象的实例方法 | containingObject::instanceMethodName |
引用某个类型的任意对象的实例方法 | ContainingType::methodName |
引用构造方法 | ClassName::new |
案例(对比使用lambda)
package jdk8.lambda; import java.time.LocalDate; import java.util.Arrays; /** * jdk8.lambda * * @Description: * @author: changliu * @Date: 2019/7/31 */ public class refer { /** * 实体类-人 */ public static class Person{ public Person(String name, LocalDate birthday) { this.name = name; this.birthday = birthday; } private String name; private LocalDate birthday; public static int compareByAge(Person a, Person b) { return a.birthday.compareTo(b.birthday); } } public static void main(String[] args) { Person[] pArr = new Person[]{ new Person("003", LocalDate.of(2016,9,1)), new Person("001", LocalDate.of(2016,2,1)), new Person("002", LocalDate.of(2016,3,1)), new Person("004", LocalDate.of(2016,12,1))}; //使用lambda表达式和类的静态方法 Arrays.sort(pArr, (a , b) -> Person.compareByAge(a, b)); //使用方法引用,引用的是类的静态方法 Arrays.sort(pArr, Person::compareByAge); System.out.println(Arrays.asList(pArr)); } }
这个例子中红色标注的是使用了方法引用,可以看出更为简洁。