对于那些用C,C ++或ObjectiveC编写的人,理解Blocks非常简单。为什么在Java(8)中获取概念如此困难?
我会回答我的问题!
答案 0 :(得分:2)
阻止强>
只是花括号括起来的语句列表。就这样。通过按顺序执行其各个语句来执行块。这与称为“块”的东西完全不同,例如Ruby编程语言。
<强>封闭强>
Java没有闭包,但它有一些看起来像一个:
int limit = ...;
Thread t = new Thread(new Runnable() {
@Override
public void run() {
for (int i=0 ; i<limit ; i++) { ... }
}
});
这可能看起来就像run()方法引用外部作用域中的变量limit
,但除非变量limit
实际上是不可变的,否则它不会编译。这里真正发生的是匿名内部类有一个名为limit
的成员变量,以及一个带有名为limit
的参数的隐藏构造函数,并通过从周围范围复制 limit
的值,将值提供给构造函数。
<强> LAMBDA 强>
更多烟雾和镜子。 Java中lambda表达式的值不是函数:它是实现功能接口的匿名内部类的实例。我上面写的相同代码可以更简洁地编写为Java lambda表达式:
int limit = ...;
Thread t = new Thread(() -> {
for (int i=0 ; i<limit ; i++) { ... }
});
Java8引入了@Functional
接口类型的概念,它必须只声明一个方法。在这种情况下,他们已将java.lang.Runnable
类重新调整为@Functional
当编译器读取上面的代码时,它知道让匿名类实现Runnable
接口,因为这是Thread
构造函数接受的唯一类型,并且它知道lambda应该成为run()
方法,因为这是Runnable.
答案 1 :(得分:-2)
您需要了解的只是“类型”。
变量具有类型。例如:
int i, double d…
对象具有类型(类)。例如:
String s, Number n, Object o, MyClass m…
一个函数有一个类型。例如:
void function () <= this type is: a function with no return and no param.
void function (type param) <= this type is: a function with no return with a param of type ‘type’
type function (type param) <= this type is: a function with a return of type ‘type’ and a param of type ‘type’
什么是块/闭包/ lambda?
它基本上是一个给定类型的局部函数,作为参数传递给另一个函数。
所以我们听说:一个函数将给定类型的函数作为参数。 以及接收功能并启动它的功能!
主要用途是:CallBack和Comparaison功能。但梦想是开放的。
我们可以将其描绘为:
type function(type function_param) {
excute the function_param
}
如何在Java中说这个。
1 /声明block / closure / lambda的类型
2 /创建函数(在类中或不在类中),将类型作为param
3 /创建block / closure / lambda
类型的本地函数4 /将其作为参数传递给使用它的函数。
例如:
// 1 declaring the type of block/closure/lambda
interface CallBack {
public int function(String string);
}
class MyClass {
private String name;
MyClass(String name) { this.name = name; }
void display () { System.out.println(this.name); }
// 2 creating the function that which that kind of type as param
int myFunction(CallBack funcCallBack) {
return funcCallBack.function(name);
}
}
public class Main {
public static void main(String[] args) {
// 3 Create the local function of the type of the block/closure/lambda
CallBack message = (String string) -> {
System.out.println("Message: "+string);
return 1;
};
MyClass mc = new MyClass("MyClass");
mc.display();
// 4 pass it as param to the function which use it.
int res = mc.myFunction(message);
System.out.println(res);
}
}
输出
MyClass的
消息:MyClass
1