Lamda表达式
1 概况
Lambda表达式 --> 函数式编程(函数编程思想) 面向对象编程思想: 强调的是【对象】,必须通过对象的形式来做一些事情,一般情况下会比较复杂。
例如:多线程执行任务,需要创建对象,对象需要实现接口Runnable,我们想自己完成,需要将run方法中的代码传递给线程对象,这么麻烦?直接执行 不久好了吗?
函数编程思想:
函数需要得有输入量、输出量,使用输入量计算得到输出量,【拿什么东西做什么事】
就是为了尽量忽略对象的复杂用法---强调做什么,而不是以什么实行做,
同样执行线程任务,使用函数编程思想,可以直接通过传递一段代码给线程对象执行,不需要创建任务对象。
总之就一句话,函数编程思想可以通过一段代码完成面向对象想要做的代码量
可以将Lambda表达式理解为一个匿名函数; Lambda表达式允许将一个函数作为另外一个函数的参数; 我们可以把 Lambda 表达式理解为是一段可以传递的代码(将代码作为实参),也可以理解为函数式编程,将一个函数作为参数进行传递。
优点:
-
λ 希腊字母表中排序第十一位的字母,英语名称为 Lamda
-
避免匿名内部类定义过多
-
可以让你的代码看起来很简洁
-
去掉了一堆没有意义的代码,留下核心的逻辑
-
其实质属于函数式编程的概念
2 Lambda表达式的格式
2.1 标准格式:
-
(参数列表) -> {代码}
-
(参数类型 参数名称) -> { 代码语句 }
-
([Lambda参数列表,即形参列表]) -> {Lambda体,即方法体}
特点:使用 "->"将参数和实现逻辑分离;( ) 中的部分是需要传入Lambda体中的参数;{ } 中部分,接收来自 ( ) 中的参数,完成一定的功能。
2.2 格式说明:
- 小括内的语法与传统方法参数列表一致,没有参数就留空,有多个参数就用逗号分隔
- 【->】 是新引入的语法格式,代表指向动作
- 大括号内的语法与传统方法体要求一致
(params)-> expression[表达式]
(params) -> statement[语句]
(params) -> {statements}
格式解析:
Lambda表达式格式:()->{}
1.小括号中书写的内容和接口中的抽象方法的参数列表一致
2.大括号中书写的内容和实现接口中的抽象方法体一致
3.箭头是固定的
2.3 重要特征
-
可选类型声明:不需要声明参数类型,编译器可以统一识别参数值。
-
可选的参数圆括号:一个参数无需定义圆括号,但多个参数需要定义圆括号。
-
可选的大括号:如果主体包含了一个语句,就不需要使用大括号。
-
可选的返回关键字:如果主体只有一个表达式返回值则编译器会自动返回值,大括号需要指定表达式返回了一个数值。
Lambda的语法非常简洁,完全没有面向对象复杂的束缚。但是使用时有几个问题需要特别注意:
-
使用Lambda必须具有接口,且要求接口中有且仅有一个抽象方法。
无论是JDK内置的Runnable、Comparator接口还是自定义的接口,只有当接口中的抽象方法存在且唯一时,才可以使用Lambda。
-
使用Lambda必须具有上下文推断。
也就是方法的参数或局部变量类型必须为Lambda对应的接口类型,才能使用Lambda作为该接口的实例。
备注:有且仅有一个抽象方法的接口,称为“函数式接口”。
2.4 格式案例说明
(1) 线程案例
Thread thread1 = new Thread(new Runnable() {
@Override
public void run () {
System.out.println("线程需要执行的任务代码1");
}
});
thread1.start();
// Lambda表达式
Thread t2 = new Thread(()->{
System.out.println("线程需要执行的任务代码2");
});
t2.start();
(2) 比较器案例
List<Integer> list = new ArrayList<>();
Collections.addAll(list,11,22,33,44,55);
System.out.println("排序之前的集合:" + list);
// 比较器的正常书写格式
Collections.sort(list, new Comparator<Integer>() {
@Override
public int compare (Integer o1, Integer o2) {
return o2-o1;
}
});
// Lambda表达式
Collections.sort(list,(Integer o1, Integer o2)->{return o2-o1;});
System.out.println("排序之后的集合:" + list);