1. 程式人生 > 程式設計 >JAVA 8 '::' 關鍵字詳解

JAVA 8 '::' 關鍵字詳解

Java 8 中我們可以通過`::` 關鍵字來訪問類的構造方法,物件方法,靜態方法。

現有一個類 Something

class Something {
 
  // constructor methods
  Something() {}
 
  Something(String something) {
	System.out.println(something);
  }
 
  // static methods
  static String startsWith(String s) {
    return String.valueOf(s.charAt(0));
  }
  
  // object methods
  String endWith(String s) {
    return String.valueOf(s.charAt(s.length()-1));
  }
  
  void endWith() {}
}

如何用 '::' 來訪問類Something中的方法呢?先定義一個介面,因為必須要用 functional interface 來接收,否則編譯錯誤(The target type of this expression must be a functional interface)

@FunctionalInterface
interface IConvert<F,T> {
  T convert(F form);
}

(@FunctionalInterface 註解要求介面有且只有一個抽象方法,JDK中有許多類用到該註解,比如 Runnable,它只有一個 Run 方法。)

觀察介面 IConvert,傳參為型別 F,返回型別 T。所以,我們可以這樣訪問類Something的方法:

訪問靜態方法

// static methods
IConvert<String,String> convert = Something::startsWith;
String converted = convert.convert("123")

訪問物件方法

// object methods
Something something = new Something();
IConvert<String,String> converter = something::endWith;
String converted = converter.convert("Java");

訪問構造方法

// constructor methods
IConvert<String,Something> convert = Something::new;
Something something = convert.convert("constructors");

總結

我們可以把類Something中的方法static String startsWith(String s){...}、String endWith(String s){...}、Something(String something){...}看作是介面IConvert的實現,因為它們都符合介面定義的那個“模版”,有傳參型別F以及返回值型別T。比如構造方法Something(String something),它傳參為String型別,返回值型別為Something。註解@FunctionalInterface保證了介面有且僅有一個抽象方法,所以JDK能準確地匹配到相應方法。

到此這篇關於JAVA 8 '::' 關鍵字的文章就介紹到這了,更多相關JAVA 8 '::' 關鍵字內容請搜尋我們以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援我們!