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數組,通過生日進行排序,排序規則爲:按照年齡從大到小排列
- 使用Arrays的sort方法:
public static void sort(T[] a, Comparator<? super T> c)
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 <T> 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<Person>() {
@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)是等同的。
總結:
方法引用的標準形式是:類名::方法名。(注意:只需要寫方法名,不需要寫括號)有以下四種形式的方法引用:
四種形式方法引用的具體用法示例請參看以下資料:
Java8之方法引用