要了解lambda表达式,就要先了解java编程的关键,就是万物皆可为对象。但是,当我们在处理一个函数或者说某种方法的时候,我们很少将他作为一个对象来思考。由此在编程时,当我们需要传入一个方法的时候,往往是将包含这个方法的接口传入。我们似乎很难将一个方法,或者说一种行为当成一个对象来看待。但是,在java8中,lambda表达式解决了这个问题。
1、什么是lambda表示,为什么要有lambda表达式
Lambda 表达式,也可称为闭包,它是推动 Java 8 发布的最重要新特性。 Lambda 允许把函数作为一个方法的参数(函数作为参数传递进方法中)。 使用 Lambda 表达式可以使代码变的更加简洁紧凑。
lambda表达式只适用于函数式接口------只有一个抽象方法的接口。因为lambda表达式只能重写一个方法,若接口多于一个抽象方法,将无法识别重写的是哪一个方法。
lambda表达式只适用于只有一个抽象函数的接口
2、lambada表达式的几种用法
lambda表达式索要解决的是函数传递问题。所以其写法的一些特征仍符合函数的特征。
其一般的写法为
(parameter)->{statement};(parameter)->expression
无参数,只有一条语句
一般写法
public int print(){
return 5;
}
lambda表达式
()->5 //返回值为5
一个参数,只有一条语句
一般写法
public int print(int x){
return x/2;
}
lambda表达式(可以不写参数类型,会自动进行类型匹配)
x->x/2 //返回x/2的值
两个参数,多条语句
一般写法
public int (int x,int y){
y=x-2;
x=y-2;
return y-x;
lambda表达式
(int x,int y)->{ y=x-2;x=y-2;return y-x;}
但是你直接这么写是不行的,因为编译器并不知道这些方法实在哪定义的。所以,他的真正用法应该是这样的
interface Welcome{ //创建一个接口
void print();
}
public class Main{
public static void main(String args[]){
Welcome welcome = ()->{System.out.println("Hello world!");}; //直接实现接口内的方法
welcome.print();
}
}
3、情景模拟
给定一组字符串,希望对其按照字母大小进行排序。在没有学lambda表达式之前,我的想法是先创建一个能实现Comparater接口的引用,之后调用Collection.sort方法。逻辑很简单,但是代码太长了。那用了lambda表示之后会怎样呢。
不使用lambda表达式
List<String> word = Arrays.aslist("abc","cba","nba");
Comparator comparator = new Comparator<String>(){
@override
public int compare(String a,String,b){
return b.compareTo(a);
}
};
Collections.sort(names, comparator);
使用lambada表达式
List<String> word = Arrays.aslist("abc","cba","nba");
Collections.sort(names, (a,b)->b.compareTo(a);
4、变量作用域
lambda表达式实质上还是对接口的引用,所以表达式箭头右边的内容与接口中对参数的要求相同,即隐式的被static final修饰的
1、lambda 表达式只能引用标记了 final 的外层局部变量,这就是说不能在 lambda 内部修改定义在域外的局部变量,否则会编译错误。
2、可以直接在 lambda 表达式中访问外层的局部变量。
3、lambda表达式内声明的局部变量是被隐式flnal修饰的,与implements接口相似。
4、在 Lambda 表达式当中不允许声明一个与外层局部变量同名的参数或者局部变量。