02 Lambda表达式
1. 概念:
Java8 中新增加了lambda表达式,通过使用lambda表达式可以编写复杂的处理算法,
开发者在编写代码时,只要简单的修改 一个方法,就能让代码在多核CPU上高效运行。
可以把Lambda表达式理解为【简洁地】表示 【可传递的】【匿名函数】 的一种方式;
它没有名称,但它有参数列表、函数主体、返回类型,可能还有一个可以抛出的异常列表。
匿名:我们说匿名,是因为它不像普通的方法那样有一个明确的名称。
函数:我们说它是函数,是因为Lambda函数不像方法那样属于某个特定的类。
但和方法一样,Lambda有参数列表、函数主体、返回类型,还可能有可以抛出的异常列表。
传递:Lambda表达式可以作为参数传递给方法或存储在变量中。(行为参数)
简洁:无需像匿名类那样写很多模板代码。
lambda表达式的作用:**【 lambda表达式可以快速实现接口中的方法 】**
eg : 函数式编程,lambda表达式 替代 匿名内部类
public static void main(String[] args) throws Exception {
//传统匿名内部类编程:
Comparator<String> c = new Comparator<String>() {
@Override
public int compare(String o1, String o2) {
return o1.length() - o2.length();
}
};
//函数式编程:参数 + 返回值
Comparator<String> d = (o1,o2)->o2.length() - o1.length();
//Comparator<String> d = (o1,o2)-> { return o2.length() - o1.length();};
TreeSet<String> set = new TreeSet<>(c);
}
2. lambda表达式的使用:
** 基本格式: () -> {}**
() 中用来写传入的参数值,要和函数式接口中的抽象方法的参数类型一致
{} 用来写表达式的具体实现代码。
-> 固定格式,不可在中间添加空格
注:如果大括号里只有一句返回值代码,可以这样写: **() -> 返回值; **
如果不止一句代码,需要用 {} 包围,且 {} 里的代码需要打分号,就是普通正常代码。
如果没有返回值,且只有一句代码的情况下,不可以简写,系统会默认当作返回值返回!
1)没有参数,没有返回值: ()->{}
2)没有参数,有返回值: ()->{return 值;} ()-> 值;
3)有一个参数,没有返回值: (a)->{System.out.println(a)}
4)有一个参数,有返回值: (a)->{a++;return a;}
注:只有一个参数,()也可以不写: a->{};
5)有两个参数,没有返回值: (a,b)->{a++;System.out.println(b);}
6)有两个参数,有返回值: (a,b)->{a++;return a;}
3. lambda中局部变量的作用范围:
lambda中可以使用成员变量、局部变量,
但是,只要在lambda表达式中使用过局部变量,该局部变量就会默认修改为final,
不论是在lambda表达式里面还是外面,都不能再修改了。
成员变量没有使用限制
static int sum = 20;
public static void main(String[] args) {
//int id = 10; 变量名不能和lambda表达式的参数值一样
int age = 10;
I3 i1 = (id)-> {
System.out.println(id++);
System.out.println(sum);
sum = 24;
System.out.println(age);
//age = 20; //如果在lambda表达式中使用了局部变量age
//会默认将局部变量的age修改为final修饰的,
//所以不能再次赋值
};
sum = 25;
//age = 20;
}