Jdk1.8新特性(三)——方法引用::

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之方法引用

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章