一. Lambda是什么
Lambda是JDK8新的特性,一个比较有趣的语法格式,我们还称为函数式编程。
函数式编程思想:
我们只需要关心结果,不关心过程,以及谁来实现。
二. Lambda能做什么
- 极大的减少代码冗余(最主要的体现就是使用Lambda表达式简化匿名内部类)
- 顺序和并行执行支持(使用lambda表达式的另一个好处是,我们可以受益于Stream API的顺序和并行操作支持)
下面我们就来快速的了解Lambda表达式的使用。
三. Lambda表达式的使用
Lambda表达式的基本格式
( )->{ }
一些参数,一个箭头,一些代码
():重写接口中唯一抽象方法的参数列表,没有参数就空着,有多个参数使用逗号隔开
->:传递,可以把参数传递给{ }方法体使用
{ }:重写接口中唯一抽象方法的方法体
Lambda表达式的使用前提:
1.必须有接口
2.接口中只能有且仅有一个抽象方法(函数式接口)
注意:
Lambda表达式是可推导可省略
Lambda表达式的目的就是重写接口中唯一的抽象方法
接口的方法只有一个,可以推导出重写的就是接口中唯一的抽象方法,所以可以简化代码
Lambda表达式简化格式
简化:
1.(参数列表):参数列表的数据类型是可以推导出来的,可以省略
(int a)-->(a)
(int a,String s)-->(a,s)
2.(参数列表):参数列表中只有一个参数,()小括号也可以省略,但是参数列表没有参数,()小括号不能省略
(int a)-->a
()-->不能省略-->()
3.{重写抽象方法的方法体}:重写的方法体,如果只有一行代码(java中行是以分号隔开的)
无论方法是否有返回值
{ }和一行代码结束的分号(;)和return关键字可以省略不写
但是他们必须一起省略
1.使用Lambda表达式简化匿名内部类
public class LambdaTest {
public static void main(String[] args) {
//传统方式实现多线程
new Thread(new Runnable() {
@Override
public void run() {
System.out.println(Thread.currentThread().getName() + "实现多线程程序!");
}
}).start();
//使用Lambda表达式的方式实现多线程
new Thread(() -> {
System.out.println(Thread.currentThread().getName() + "使用Lambda表达式的方式,实现多线程程序!");
}).start();
}
}
2.使用Lambda表达式重写有参数有返回值的方法
public class LambdaTest2 {
@NoArgsConstructor
@AllArgsConstructor
@Data/*lombok*/
static class Person {
String name;
int age;
}
public static void main(String[] args) {
ArrayList<Person> list = new ArrayList<>();
list.add(new Person("小王", 28));
list.add(new Person("小明", 18));
list.add(new Person("小张", 38));
//遍历
list.forEach(System.out::println);
//传统方式排序
list.sort(new Comparator<Person>() {
@Override
public int compare(Person o1, Person o2) {
return o2.getAge() - o1.getAge();
}
});
//lambda简化传统排序
list.sort((o1, o2) -> o2.getAge() - o1.getAge());/*按年龄倒序排序*/
System.out.println("排序后>>>>>>>>>>>>>>>>>>>>>>>>>>>");
//遍历
list.forEach(System.out::println);
}
}
public class LambdaTest3 {
@NoArgsConstructor
@AllArgsConstructor
@Data/*lombok*/
static class Person {
String name;
int age;
}
public static void main(String[] args) {
/*简化前
TreeSet<Person> set = new TreeSet<>(new Comparator<Person>() {
@Override
public int compare(Person o1, Person o2) {
return o2.getAge()-o1.getAge();
}
});*/
//简化后
TreeSet<Person> set = new TreeSet<>((o1, o2) -> o2.getAge() - o1.getAge());
set.add(new Person("小王", 28));
set.add(new Person("小明", 18));
set.add(new Person("小张", 38));
set.forEach(System.out::println);
}
}
如果你和我一样,对Lambda很感兴趣 请继续了解,函数式接口以及Stream流。
链接: 函数式接口
链接: Stream流Api