Java 實例方法引用

2018-03-18 16:51 更新

Java Lambda - Java實例方法引用


我們可以通過兩種方式獲得一個實例方法引用,從對象實例或從類名。

基本上我們有以下兩種形式。

  • instance::MethodName
  • ClassName::MethodName

這里實例表示任何對象實例。 ClassName 是的名稱類,例如 String , Integer 。

實例 ClassName 稱為接收器。更具體地說, instance 被稱為有界接收器,而 ClassName 被稱為無界接收器。

我們稱為實例有界接收器,因為接收器被限制到實例。

ClassName 是未經(jīng)過排隊的接收器,因為接收器以后有界。


綁定實例方法引用

綁定接收器接收器具有以下形式:

instance::MethodName

在下面的代碼中,我們使用buildin系統(tǒng)函數(shù)接口Supplier作為lambda表達式類型。

首先,我們以正常的方式定義一個lambda表達式。 lambda表達式不接受參數(shù),并返回字符串 'w3cschool.cn' 的長度,

我們使用 'w3cschool.cn' 創(chuàng)建一個String實例,并使用它的length方法作為實例方法引用。

綁定意味著我們已經(jīng)指定了實例。

以下示例顯示如何使用沒有參數(shù)的綁定接收器和方法來創(chuàng)建實例方法引用。

import java.util.function.Supplier;

public class Main{
  public static void main(String[] argv){
    Supplier<Integer> supplier  = () ->  "m.hgci.cn".length(); 
    System.out.println(supplier.get());
    
    
    Supplier<Integer> supplier1  = "m.hgci.cn"::length; 
    System.out.println(supplier1.get());
  }
}

上面的代碼生成以下結(jié)果。



例1

以下示例顯示如何使用綁定接收器和方法與參數(shù)創(chuàng)建實例方法引用。

import java.util.function.Consumer;

public class Main{
  public static void main(String[] argv){
    Util util = new Util();
    
    Consumer<String> consumer  = str ->  util.print(str);
    consumer.accept("Hello"); 
    

    Consumer<String> consumer1  = util::print;
    consumer1.accept("m.hgci.cn");
    
    util.debug();
  }
}
class Util{
  private int count=0;
  public void print(String s){
    System.out.println(s);
    count++;
  }
  public void debug(){
    System.out.println("count:" + count);
  }
}

上面的代碼生成以下結(jié)果。

未綁定實例方法引用

未綁定的接收器使用以下語法

ClassName::instanceMethod

它與我們用來引用靜態(tài)方法的語法相同。

從以下代碼,我們可以看到輸入類型是ClassName的類型。

在下面的代碼中,我們使用 String:length ,因為函數(shù)接口的輸入類型為 String

lambda表達式在使用時獲取輸入。

以下代碼使用String length方法作為unbind實例方法引用。

String length方法通常在字符串值實例上調(diào)用,并返回字符串實例的長度。因此,輸入是String類型,輸出是int類型,這是匹配buildin函數(shù)功能接口。

每次我們調(diào)用 str Length Func ,我們傳入一個字符串值,并從傳遞的字符串值中調(diào)用length方法。

import java.util.function.Function;

public class Main{
  public static void main(String[] argv){
    Function<String,  Integer> strLengthFunc = String::length; 
    String name ="m.hgci.cn";
    int len   =  strLengthFunc.apply(name); 
    System.out.println("name  = "  +  name + ", length = "  + len);
    
    name ="www.m.hgci.cn";
    len   =  strLengthFunc.apply(name); 
    System.out.println("name  = "  +  name + ", length = "  + len);

  }
}

上面的代碼生成以下結(jié)果。

例2

下面的代碼定義了一個具有稱為append的靜態(tài)方法的類Util。

append 方法接受兩個 String 類型參數(shù),并返回一個 String 類型的結(jié)果。

然后使用 append 方法創(chuàng)建一個lambda表達式并賦值給Java buildin BiFunction 函數(shù)接口。

append方法的簽名與BiFunction 函數(shù)接口中定義的抽象方法的簽名相匹配。

import java.util.function.BiFunction;

public class Main{
  public static void main(String[] argv){
    BiFunction<String,  String,String> strFunc = Util::append; 
    String name ="m.hgci.cn";
    String s=  strFunc.apply(name,"hi"); 
    System.out.println(s);
  }
}
class Util{
  public static String append(String s1,String s2){
    return s1+s2;
  }  
}

上面的代碼生成以下結(jié)果。

超類型實例方法引用

關(guān)鍵字 super 僅在實例上下文中使用,引用覆蓋的方法。

我們可以用下面的語法來創(chuàng)建是指在父類型的實例方法的方法引用。

ClassName.super::instanceMethod

下面的代碼定義了一個稱為 ParentUtil 的父類。在 ParentUtil 中有一個名為 append 的方法,它將兩個String值附加在一起。

然后創(chuàng)建一個名為 Util 的子類并擴展 ParentUtil

Util 類中,覆蓋 append 方法。

在Util的構(gòu)造函數(shù)中,我們創(chuàng)建兩個lambda表達式,一個是使用Util的append方法,另一個是使用ParentUtil類的append方法。

我們使用 this::append 引用當(dāng)前類,同時使用 Util.super::append 從父類引用方法。

import java.util.function.BiFunction;

public class Main{
  public static void main(String[] argv){
    new Util();
  }
}
class Util extends ParentUtil{
  
  public Util(){
    BiFunction<String,  String,String> strFunc = this::append; 
    String name ="m.hgci.cn";
    String s=  strFunc.apply(name," hi"); 
    System.out.println(s);
    
    strFunc = Util.super::append; 
    name ="m.hgci.cn";
    s=  strFunc.apply(name," Java Lambda Tutorial"); 
    System.out.println(s);

  }
  
  @Override
  public String append(String s1,String s2){
    System.out.println("child append");
    return s1+s2;
  }  
}
class ParentUtil{
  public String append(String s1,String s2){
    System.out.println("parent append");
    return s1+s2;
  }  
}

上面的代碼生成以下結(jié)果。

以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號