Lambda表达式可以用来创建匿名方法,有时候使用lambda表达式仅仅是调用一个已存在的方法:
Arrays.sort(stringsArray,(s1,s2)->s1.compareToIgnoreCase(s2));
在java8中,可以直接通过方法引用的来简写lambda表达式中已经存在的方法:
Arrays.sort(stringsArray,String::compareToIgnoreCase);
这种特性就是方法引用。
方法引用是一种更简洁易懂的lambda表达式,操作符是双冒号::,被用来直接访问类或者实例已经存在的方法或构造方法。方法引用提供了一种引用而不执行的方式,它需要由兼容的函数式接口构成的目标上下文。计算时,方法引用会创建函数式接口的一个实例。
在Java 8中,我们会使用Lambda表达式创建匿名方法,但是有时候,我们的Lambda表达式可能仅仅调用一个已存在的方法,而不做任何其它事,对于这种情况,通过一个方法名字来引用这个已存在的方法会更加清晰,Java 8的方法引用也允许我们这样做。
示例:
定义一个Person实体类
实现:已知一个person数组,通过生日进行排序,排序规则为:按照年龄从大到小排列
package com.example.jdknewuse;
import org.junit.Test;
import java.text.SimpleDateFormat;
import java.util.Arrays;
import java.util.Comparator;
import static org.junit.Assert.*;
/**
* 实现:已知一个person数组,通过生日进行排序,排序规则为:按照年龄从大到小排列
* 使用Arrays的sort方法:
* public static void sort(T[] a, Comparator super T> c)
* Created by liumengbing on 2019/02/19 10:02.
*/
public class PersonTest {
@Test
public void personTest() throws Exception{
SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd");
Person[] personArray = new Person[]{
new Person(sdf.parse("20050901"),"tom"),
new Person(sdf.parse("20010901"),"mary"),
new Person(sdf.parse("20060901"),"jack"),
new Person(sdf.parse("20020901"),"nick"),
new Person(sdf.parse("20040901"),"sarah")
};
//方法一:使用匿名内部类
Arrays.sort(personArray, new Comparator() {
@Override
public int compare(Person o1, Person o2) {
return o1.getBirthday().compareTo(o2.getBirthday());
}
});
System.out.print(Arrays.asList(personArray));//[mary, nick, sarah, tom, jack]
//方法二:因为Comparator接口是一个函数式接口,所以我们可以使用lambda表达式(未调用已存在的方法)
Arrays.sort(personArray,(o1,o2)->{
return o1.getBirthday().compareTo(o2.getBirthday());
});
System.out.print(Arrays.asList(personArray));//[mary, nick, sarah, tom, jack]
//方法三:使用lambda表达式(使用已存在的compareByAge方法)
Arrays.sort(personArray,(o1,o2)->Person.compareByAge(o1,o2));
System.out.print(Arrays.asList(personArray));//[mary, nick, sarah, tom, jack]
//方法四:因为这个Lambda表达式调用了一个已存在的方法,因此,我们可以直接使用方法引用来替代这个Lambda表达式
Arrays.sort(personArray,Person::compareByAge);
System.out.print(Arrays.asList(personArray));//[mary, nick, sarah, tom, jack]
}
}
注意:方法引用Person::compareByAge在语义上与lambda表达式(o1,o2)->Person.compareByAge(o1,o2)是等同的。
总结:
方法引用的标准形式是:类名::方法名。(注意:只需要写方法名,不需要写括号)有以下四种形式的方法引用: