天天看點

java8新特性_Java8新特性之方法引用|樂位元組4.1、基本格式4.2、方法引用分類

夥伴們,五一假期前我講過了《Java8新特性之函數式接口》,這次我接着講Java8新特性之方法引用。

Java8 中引入方法引用新特性,用于簡化應用對象方法的調用, 方法引用是用來直接通路類或者執行個體的已經存在的方法或者構造方法。 方法引用提供了一種引用而不執行方法的方式,它需要由相容的函數式接口構成的目标類型上下文。計算時,方法引用會建立函數式接口的一個執行個體。 當Lambda表達式中隻是執行一個方法調用時,不用Lambda表達式,直接通過方法引用的形式可讀性更高一些。方法引用是一種更簡潔易懂的Lambda表達式。

4.1、基本格式

方法引用使用一對冒号 :: 來簡化對象方法的調用,當你想要使用方法引用時,目标引用放在分隔符 :: 前,方法名稱放在後面, 如下形式:

java8新特性_Java8新特性之方法引用|樂位元組4.1、基本格式4.2、方法引用分類

樂位元組-Java8方法引用 圖1

方法引用參考示例:

java8新特性_Java8新特性之方法引用|樂位元組4.1、基本格式4.2、方法引用分類

樂位元組-Java8方法引用 圖2

4.2、方法引用分類

Java8 中對于方法引用主要分為三大類:

  • 構造器引用 Class::new
  • 靜态方法引用 Class::static_method
  • 特定對象的方法引用 instance::method

4.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 factory01= IPhone::new; IPhone p01 = factory01.get(); System.out.println(p01);​ /** * 等價的Lambda 寫法 */ Supplier factory02 = ()->new IPhone(); IPhone p02 = factory02.get(); System.out.println(p02);    /** * 當構造器方法存在參數 參數個數為1個時 */ Function factory03 = IPhone::new; IPhone p03 = factory03.apply(2019); System.out.println(p03);​ /** * 等價的Lambda 寫法 */ Function factory04 = (id)-> new IPhone(id); IPhone p04 = factory04.apply(2019); System.out.println(p04);   /** * 當構造器方法存在參數 參數個數為2個時 */ BiFunction factory05 = IPhone::new; IPhone p05 = factory05.apply(2019,"iphoneX"); System.out.println(p05);​ /** * 等價的Lambda 寫法 */ BiFunction factory06 = (id,name)-> new IPhone(id,name); IPhone p06 = factory06.apply(2019,"iphoneMax"); System.out.println(p06); /** 當構造器參數參過2個時怎麼解決呢??? **/ }
           

4.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"); }}​/** * 定義函數式接口 */@FunctionalInterfacepublic interface PrintFunction{ void print();}​ // 靜态方法引用PrintFunction pf01= IPhone::info;pf01.print();/** * 等價的Lambda 寫法*/PrintFunction pf02 = () -> { IPhone.info();};pf02.print();​​// 靜态方法引用 靜态方法存在參數時/** * 定義函數式接口 */@FunctionalInterfacepublic interface PrintFunction02 { R print(T t);}​/** * 靜态方法引用 方法存在參數時 */PrintFunction02 pf03 = IPhone::getPrice;System.out.println(pf03.print("iphone"));​/** * 等價的Lambda 寫法 */PrintFunction02 pf04 =(str)->{ return IPhone.getPrice(str);};
           

4.2.3、特定類的任意執行個體化對象的方法引用

文法是instance::method ,此時引用方法時必須存在執行個體,示例代碼如下:

/** * 構造器引用 執行個體化對象 * 成員方法引用*/BiFunction factory07= IPhone::new;IPhone p07 = factory07.apply(2019,"iphoneX");PrintFunction pp= p07::mm;pp.print();​/** * 等價的Lambda 寫法 */BiFunction factory08 = (id,name)-> new IPhone(id,name);IPhone p08 = factory08.apply(2019,"iphoneMax");PrintFunction pp02 = ()->{ p08.mm();};pp02.print();
           

4.2.4 類的成員方法引用(略,以後再講,敬請關注)

下回樂位元組再給大家講Java8新特性之流 Stream

java8新特性_Java8新特性之方法引用|樂位元組4.1、基本格式4.2、方法引用分類

繼續閱讀