国产chinesehdxxxx野外,国产av无码专区亚洲av琪琪,播放男人添女人下边视频,成人国产精品一区二区免费看,chinese丰满人妻videos

Java 實(shí)例方法引用

2018-03-18 16:51 更新

Java Lambda - Java實(shí)例方法引用


我們可以通過兩種方式獲得一個(gè)實(shí)例方法引用,從對(duì)象實(shí)例或從類名。

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

  • instance::MethodName
  • ClassName::MethodName

這里實(shí)例表示任何對(duì)象實(shí)例。 ClassName 是的名稱類,例如 String , Integer

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

我們稱為實(shí)例有界接收器,因?yàn)榻邮掌鞅幌拗频綄?shí)例。

ClassName 是未經(jīng)過排隊(duì)的接收器,因?yàn)榻邮掌饕院笥薪纭?/span>


綁定實(shí)例方法引用

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

instance::MethodName

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

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

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

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

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

import java.util.function.Supplier;

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

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



例1

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

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("eska-fuses.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é)果。

未綁定實(shí)例方法引用

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

ClassName::instanceMethod

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

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

在下面的代碼中,我們使用 String:length ,因?yàn)楹瘮?shù)接口的輸入類型為 String 。

lambda表達(dá)式在使用時(shí)獲取輸入。

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

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

每次我們調(diào)用 str Length Func ,我們傳入一個(gè)字符串值,并從傳遞的字符串值中調(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 ="eska-fuses.cn";
    int len   =  strLengthFunc.apply(name); 
    System.out.println("name  = "  +  name + ", length = "  + len);
    
    name ="www.eska-fuses.cn";
    len   =  strLengthFunc.apply(name); 
    System.out.println("name  = "  +  name + ", length = "  + len);

  }
}

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

例2

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

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

然后使用 append 方法創(chuàng)建一個(gè)lambda表達(dá)式并賦值給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 ="eska-fuses.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é)果。

超類型實(shí)例方法引用

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

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

ClassName.super::instanceMethod

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

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

Util 類中,覆蓋 append 方法。

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

我們使用 this::append 引用當(dāng)前類,同時(shí)使用 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 ="eska-fuses.cn";
    String s=  strFunc.apply(name," hi"); 
    System.out.println(s);
    
    strFunc = Util.super::append; 
    name ="eska-fuses.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)容是否對(duì)您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)