原文参看: oracle 官网教程
方法引用(Method References)
假设你使用 lambda 表达式 创建一个匿名方法。有时,这个匿名表达式什么都没做,只是 调用了一个 已经存在的方法。这个时候,通过名称 引用 存在的方法会更加清晰。 方法引用就是用来实现这个过程,这种方法更紧凑,是一种更容易阅读的 lambda 表达式。
lambda 这篇文章的 第六小节展示了 方法引用。
方法引用的种类
四类方法引用:
引用一个静态方法: ContainingClass :: staticMethodName
引用一个特定对象 的 实例方法: containingObject :: instanceMethodName
引用特定类型的任意对象的实例方法: ContainingType :: methodName
引用构造函数: ClassName :: new
案例
java bean
package com.ycit.bean;
import java.time.LocalDate;
/**
* 学生类
*
* @author xlch
* @create 2017-05-17 22:15
*/
public class Student {
private String name;
private String gender;
private String address;
private LocalDate birthday;
// getter setter
// constructor
/**
* 静态方法 根据年龄比较
* @param a
* @param b
* @return
*/
public static int compareByAge(Student a, Student b) {
return a.birthday.compareTo(b.birthday);
}
}
测试类:
@Test
public void methodReferenceTest() {
Student zs = new Student("张三", LocalDate.parse("19920803", DateTimeFormatter.ofPattern("yyyyMMdd")));
Student ls = new Student("李四", LocalDate.parse("19901003", DateTimeFormatter.ofPattern("yyyyMMdd")));
List<Student> students = new ArrayList<>();
students.add(zs);
students.add(ls);
Student[] studentArray = students.toArray(new Student[students.size()]);
//原始写法
Arrays.sort(studentArray, new Comparator<Student>() {
@Override
public int compare(Student o1, Student o2) {
return o1.getBirthday().compareTo(o2.getBirthday());
}
});
// lambda 表达式写法
Comparator<Student> comparatorLambda = (a, b) -> a.getBirthday().compareTo(b.getBirthday());
Arrays.sort(studentArray, comparatorLambda);
// ① 静态方法引用
Comparator<Student> comparatorStatic = Student::compareByAge; // 这里使用的函数接口为 Comparator<T>
Arrays.sort(studentArray, comparatorStatic);
// ② 特定对象的实例方法引用
ComparisonProvider provider = new ComparisonProvider();
Comparator<Student> comparatorSpecific = provider::compareByName;
Arrays.sort(studentArray, comparatorSpecific);
// ③ 特定类型的任意对象的实例方法引用
String[] stringArray ={ "Barbara", "James", "Mary", "John",
"Patricia", "Robert", "Michael", "Linda" };
Arrays.sort(stringArray, String::compareToIgnoreCase);
Arrays.sort(stringArray, (s1, s2) -> s1.compareToIgnoreCase(s2)); // 特定类型的任意对象的实例方法引用 转为 lambda 写法
// ④ 构造函数引用
Supplier<HashSet<Student>> supplier = HashSet::new; // 构造 Supplier 函数式接口
Supplier<HashSet<Student>> supplier2 = () -> new HashSet<>(); // 构造 Supplier 函数式接口
Set<Student> r2 = transferElements(students, supplier);
Set<Student> r3 = transferElements(students, HashSet<Student>::new);
Set<Student> r1 = transferElements(students, supplier2); // 构造函数引用转化成 lambda 表达式 写法
// 使用 Comparator 中的方法——lambda 表达式
Arrays.sort(studentArray, Comparator.comparing(student ->student.getBirthday()));
// 使用 Comparator 中的方法——方法引用
Arrays.sort(studentArray, Comparator.comparing(Student::getBirthday));
Arrays.stream(stringArray).forEach(System.out::println);
Arrays.stream(studentArray).forEach(student -> System.out.println(student.getName()));
}
/**
* 将元素从一个集合拷贝到另一个集合
* @param sourceCollection
* @param collectionFactory
* @param <T>
* @param <SOURCE>
* @param <DEST>
* @return
*/
public static <T, SOURCE extends Collection<T>, DEST extends Collection<T>> DEST transferElements(
SOURCE sourceCollection,
Supplier<DEST> collectionFactory) {
DEST result = collectionFactory.get();
for (T t : sourceCollection) {
result.add(t);
}
return result;
}