在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