首先什么是Lambda表达式呢?
Lambda是java8的一种新特性,可称为闭包。类似于JavaScript中的闭包。
那闭包是什么呢?
在js中这样解释的:只有函数内部的子函数才能读取局部变量,闭包就是能够读取其他函数内部变量的函数。所以,在本质上,闭包就是将函数内部和函数外部连接起来的一座桥梁。
function A() {
var n = 123;
function B() {
console.log(n);
}
return B;
}
var result = A();
result();//返回结果为123
函数B被包括在函数A中,函数B能够读取到函数A的局部变量,而函数A却不能读取到函数B的局部变量。
2. 为什么使用Lambda表达式
我们可以把Lambda表达式理解为一段可以传递的代码(将代码像数据一样进行传递)。Lambda允许把函数作为一个方法的参数,使用Lambda表达式可以写出更简洁、更灵活的代码,而其作为一种更紧凑的代码风格,使Java的语言表达能力得到了提升。
使用场景:
那什么时候才能使用Lambda式呢?
当然是在匿名内部类中。因为它是简化匿名内部类的代码写法。
格式:
(匿名内部类被重写方法的形参列表)->{
被重写方法的方法体代码
}
注:->是语法形式,无实际意义
举个栗子来康康lambd表达式
首先我们先定义一个抽象类,通过匿名内部类重写其方法,再对其进行简化,比较二者之间有何变化
public static void main (String[] args){
People p = new People(){
@Override
public void run(){
System.out.println("在不加油,你就卷不赢了。");
}
};
p.run();
}
abstract class People{
public abstract void run();
}
使用Lambda表达式:
People p = ()->{
System.out.println("小学生跑的很慢");
};
//会出现报错
会出现报错,这是为什么呢?原因在于前面对于Lambda表达式的定义并不清晰,Lambda表达式并不能简化所有匿名内部类,其只能简化函数式接口匿名内部类的写法形式,且接口中有且仅有一个抽象方法,通常,我们会再接口上加上一个@Functionalinterface注解,标记该接口必须是满足函数式接口。
所以我们重新来一遍
@FunctionalInterface//加上这个注解必须是函数式接口,且只有一个抽象方法
interface People{
void run();
}
//简化之前的匿名内部类
People p = new People(){
@Override
public void run(){
System.out.println("小学生跑的很慢!");
}
};
//简化之后
People p = () -> {
System.out.println("小学生跑的很慢!");
};
基础部分
想了解详细的可以去看看这篇文章http://t.csdn.cn/Hn5kf