Java Blocks,Closures,Lambdas ......简单解释

时间:2016-03-28 21:31:34

标签: java lambda closures block

对于那些用C,C ++或ObjectiveC编写的人,理解Blocks非常简单。为什么在Java(8)中获取概念如此困难?

我会回答我的问题!

2 个答案:

答案 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