上一篇小樂介紹了《Java8新特性-函數式介面》,大家可以點擊回顧。這篇文章將接著介紹Java8新特性之方法引用。 上一篇小樂介紹了《Java8新特性-函數式介面》,大家可以點擊回顧。這篇文章將接著介紹Java8新特性之方法引用。 Java8 中引入方法引用新特性,用於簡化應用對象方法的調用, 方法 ...
上一篇小樂介紹了《Java8新特性-函數式介面》,大家可以點擊回顧。這篇文章將接著介紹Java8新特性之方法引用。
Java8 中引入方法引用新特性,用於簡化應用對象方法的調用, 方法引用是用來直接訪問類或者實例的已經存在的方法或者構造方法。 方法引用提供了一種引用而不執行方法的方式,它需要由相容的函數式介面構成的目標類型上下文。計算時,方法引用會創建函數式介面的一個實例。 當Lambda表達式中只是執行一個方法調用時,不用Lambda表達式,直接通過方法引用的形式可讀性更高一些。方法引用是一種更簡潔易懂的Lambda表達式。
1、基本格式
方法引用使用一對冒號 :: 來簡化對象方法的調用,當你想要使用方法引用時,目標引用放在分隔符 :: 前,方法名稱放在後面, 如下形式:
方法引用參考示例:
2、方法引用分類
Java8 中對於方法引用主要分為三大類:
-
構造器引用 Class::new
-
靜態方法引用 Class::static_method
-
特定對象的方法引用 instance::method
2.1、構造器引用
語法是Class::new,或者更一般的Class< T >::new實例如下
藉助構造器引用實例化Iphone 對象,代碼如下:
public class IPhone { private Integer id; private String version; private Date createTime; private String name; public IPhone() { } public IPhone(Integer id) { this.id = id; } public IPhone(Integer id, String name) { this.id = id; this.name = name; } ... } public static void main(String[] args) { /** * 構造器引用 * 無參構造器 */ // 實現Supplier 介面 通過構造器引用 Supplier<IPhone> factory01= IPhone::new; IPhone p01 = factory01.get(); System.out.println(p01); /** * 等價的Lambda 寫法 */ Supplier<IPhone> factory02 = ()->new IPhone(); IPhone p02 = factory02.get(); System.out.println(p02); /** * 當構造器方法存在參數 參數個數為1個時 */ Function<Integer,IPhone> factory03 = IPhone::new; IPhone p03 = factory03.apply(2019); System.out.println(p03); /** * 等價的Lambda 寫法 */ Function<Integer,IPhone> factory04 = (id)-> new IPhone(id); IPhone p04 = factory04.apply(2019); System.out.println(p04); /** * 當構造器方法存在參數 參數個數為2個時 */ BiFunction<Integer,String,IPhone> factory05 = IPhone::new; IPhone p05 = factory05.apply(2019,"iphoneX"); System.out.println(p05); /** * 等價的Lambda 寫法 */ BiFunction<Integer,String,IPhone> factory06 = (id,name)-> new IPhone(id,name); IPhone p06 = factory06.apply(2019,"iphoneMax"); System.out.println(p06); /** 當構造器參數參過2個時怎麼解決呢??? **/ }
2.2、靜態方法引用
語法是Class::static_method,實例如下:
使用靜態方法引用 執行IPhone 靜態方法
public class IPhone { private Integer id; private String version; private Date createTime; private String name; public IPhone() { } public IPhone(Integer id) { this.id = id; } public IPhone(Integer id, String name) { this.id = id; this.name = name; } /** 靜態方法 */ public static void info(){ System.out.println("這是一部IPhone"); } } /** * 定義函數式介面 */ @FunctionalInterface public interface PrintFunction{ void print(); } // 靜態方法引用 PrintFunction pf01= IPhone::info; pf01.print(); /** * 等價的Lambda 寫法 */ PrintFunction pf02 = () -> { IPhone.info(); }; pf02.print(); // 靜態方法引用 靜態方法存在參數時 /** * 定義函數式介面 */ @FunctionalInterface public interface PrintFunction02<T,R> { R print(T t); } /** * 靜態方法引用 方法存在參數時 */ PrintFunction02<String,Double> pf03 = IPhone::getPrice; System.out.println(pf03.print("iphone")); /** * 等價的Lambda 寫法 */ PrintFunction02<String,Double> pf04 =(str)->{ return IPhone.getPrice(str); };
2.3、特定類的任意實例化對象的方法引用
語法是instance::method ,此時引用方法時必須存在實例,示例代碼如下:
/** * 構造器引用 實例化對象 * 成員方法引用 */ BiFunction<Integer,String,IPhone> factory07= IPhone::new; IPhone p07 = factory07.apply(2019,"iphoneX"); PrintFunction pp= p07::mm; pp.print(); /** * 等價的Lambda 寫法 */ BiFunction<Integer,String,IPhone> factory08 = (id,name)-> new IPhone(id,name); IPhone p08 = factory08.apply(2019,"iphoneMax"); PrintFunction pp02 = ()->{ p08.mm(); }; pp02.print();
2.4 類的成員方法引用
(略)
接下來,小樂會繼續介紹Java8新特性之Stream,敬請期待。歡迎關註樂位元組,記得評論點贊哦。
轉發請記得註明出處和作者。