Java 1.4.2 時代,# 僅用於 Javadoc @see 標籤引用方法。Java 7 (原訂 2010 年釋出,後延至 9 月) 引入簡化版閉包,# 成為方法引用與 Lambda 表達式的關鍵符號。
String#equals(Object)
java.io.File#exists()
格式:類別名#方法名(參數型別),可作為函數式介面的實例傳遞。
傳統匿名內部類別:
button.addActionListener(
new ActionListener() {
public void actionPerformed(ActionEvent e) {
System.out.println("Hi!");
}
}
);
使用 # 閉包:
button.addActionListener(#(ActionEvent e) System.out.println("Hi!"));
傳統寫法:
public void init() {
JButton button = ...;
button.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent ev) {
handleAction(ev);
}
});
}
public void handleAction(ActionEvent ev) { /* ... */ }
使用 # 閉包:
public void init() {
JButton button = ...;
button.addActionListener(this#handleAction(ActionEvent));
}
public void handleAction(ActionEvent ev) { /* ... */ }
->)、方法引用 (::) 與 Stream API 鋪路。Java 7 正式釋出時,閉包提案經多次修訂,最終 Java 8 採用 -> 語法而非 #。本文反映 Java 7 早期提案 (Project Lambda) 設計,具歷史參考價值。