“lambda表达式”(lambda expression)是一个匿名函数,lambda表达式是基于数学中符号而得名,是一个匿名函数,即没有函数名的函数。lambda表达式可以表示闭包。
认识lambda。
1 | public static void main(String[] args) { |
设计匿名内部类的目的,就是为了方便程序员将代码作为数据来传递。但是你会发现,这个对象看起来是很多余的,所以我们不想传入对象,只想传入行为。
1 | new Thread(()->{ |
和实现某接口的对象不同,我们传入了一段代码块–一个没有名字的函数。–>将参数和表达式主题分开,左边是参数,右边是方法体。
Lambda的不同形式
1 | Runnable runnable = ()-> System.out.println("hello world"); |
该lambda表达式不包含参数(因为是空括号)。
1 | interface Test { |
(lambda只能用于函数式接口),如果参数只包含一个参数,可以省略参数的括号。
1 | interface Test2{ |
可以看到,我们在使用lambda的时候创建了一个函数x+y,Test2对象不是表示两个数字的和,而是表示两个数字相加的代码。以上的代码中,参数类型都是由编译器自己推断的,同样,我们可以明确的声明参数类型:
1 | interface Test3{ |
引用值的要求
lambda可以引用非final变量这个属性已经了解,但是要知道,java 8只是放松了这一语法的限制,但实际上要求该变量还是final。
String name = “aaa”;不管name在使用lambda的前还是后改动,lambda都会报错:表达式引用的本地变量必须是最终变量或者实际上的最终变量,简单的,我们可以称它为既成事实上的final变量。所以,lambda也称为闭包。
lambda表达式类型
java中,所有的表达式都有返回值类型,那lambda的返回值类型是什么呢。
1 | interface Test { |
拿这个例子来说,oneParam方法表示一种行为:接受一个String,返回void。只要方法名和行为和lambda表达式匹配即可完成调用。
注意:如果编译器猜不出参数和返回只的类型,则都将视为Object处理。