lambda表达式是什么?他们是如何工作的?
Shivshankar Pal为了理解什么是lambda表达式,搜索了大量的帖子和YouTube视频,在lambda表达式之前他没有使用过任何函数式语言,因此最后他发现还是很难理解lambda表达式。最终,他决定写一篇文章来帮助像他一样的人。
先来看一些lambda表达式语法:
1.(int a,int b) - > {return a + b; }
A. 具有两个参数的功能。
B. (a,b) - > {return a + b; }的工作原理也是一样的。
2.() - > System.out.println(“Hello World”);
A.没有参数的功能。
3.(String s) - > {System.out.println(s); }
A. 具有一个参数的功能。
4.(s) - > System.out.println(s);
A. 不需要指定参数的类型。
B. 单个语句不需要大括号。
5.() - > 42
6.() - > {return 3.1415};
相信一些程序员会在看完这些语法之后,已经在使用lambda表达式语法来编写一个“hello world”了,如下所示:
然后Shivshankar Pal发现:“我们只能使用有Functional接口的lambda表达式”。
那么什么是函数接口?为什么它对lambda表达式很重要?
功能接口:功能接口是一个具有单一抽象方法的接口。
例如:
你可以看到上面的接口只有一个方法,所以它是一个功能接口。
现在再来尝试编写程序“hello world”。
这是一个在lambda表达式之前的旧方法:
现在来看lambda表达式的方法:
比较编写相同代码的不同方法,您就可以正确理解lambda能为您做的事。现在有些人已经开始思考或者会问一个问题,为什么他需要一个功能借口来工作?
这就意味着只要我们想使用lambda表达式做任何事情,都需要先创建一个功能接口。API开发人员已经提供了许多通用的功能接口。这些接口位于java.util.function中。
让我们来看看java.util.function包,例:
可以在上面的例子中看到:
1. 导入 - >我们已经导入了功能包。
2. 在主方法中,我们创建了一个带有两个泛型类型接口的引用变量。
3. 这个接口有一个抽象方法,可接受两个参数,并没有任何返回。
带线程的Lambda表达式
注意:我们都知道一个“Runnable”接口只有一个 “run()” 方法。因此它也是一个功能接口,可以和lambda表达式一起使用。
例1:使用线程类型1:
用lambda表达式来做:
例2:使用线程类型2:
用lambda表达式来做:
从比较可以看出来,lambda使这些东西变得更简单。
lambda表达式可以为我们做:
1. 可以定义匿名函数
2. 可以分配给一个变量
3. 可以传递给函数
4. 可以从函数返回