在Java中,您需要先聲明接口。您不能簡單地在使用它的函數的簽名中聲明函數接口。所以,你的SWIFT代碼會翻譯爲:
// In java 7
// Declare your interface
public interface ImageListener {
public void completed(Image image);
}
// ...
// Define your `getImage` function to use the listener
public static void getImage(ImageListener completion) {
completion.completed(image);
}
// ...
// Call the function
Utility.getImage(new ImageListener() {
public void completed(Image image){
imageView.image = image;
}
});
或者與Java 8,只需:
// Skip the interface declaration and use a predefined Java 8 Functional interface:
public static void getImage(Consumer<Image> completion) {
completion.accept(image);
}
// ...
// Call the function
Utility.getImage(image -> imageView.image = image);
幾個點到亞諾什意見作出迴應:
- 定義的界面允許您有幾種方法,例如發生錯誤時調用的方法。使用閉包只需要儘可能多的塊,因爲在界面中有方法,需要一個界面。
- 該接口可以是匿名的,就像我給出的例子,但它也可以通過一個對象實現,從而可以方便地重用塊等等。
- 在Java 8中,大多數功能接口已經定義好了,所以你不需要自己定義它們。
- 創建一個接口的命名爲它提供了一個特定的含義和目的。當你將它作爲參數接收時,你應該怎麼處理它。
- 有一些接口方法的命名約定可以幫助你理解上下文。例如,在Android中,當接口方法以
on
開頭時,預計會在主線程上調用。它有助於API的開發人員表達意圖,並幫助API的用戶知道期望的內容。自我記錄,如果你願意。
所以,不是噩夢,而且在許多情況下,你甚至沒有實現它,如果你真的不想:)
正如我強調的代碼是不是** **讀採用自己的班級方式。 –
'我知道Runnable類似於塊'不是真的。類似於塊和閉包的是什麼?功能接口*。 Runnable就是其中之一,但有很多,你可以定義新的。你在swift中顯示的東西看起來像一個簡單的監聽器,你可以簡單地定義爲'public interface ImageListener {public void on(Image image); }'。或者,對於通用性:'public interface MyListener {public void on(T t); }' –
njzk2
看到例如這兩個:https://github.com/smaspe/FunctionalIterables/blob/master/src/main/java/com/smaspe/iterables/FuncIter.java#L280 – njzk2