黑马程序员技术交流社区
标题:
[石家庄校区] Lambda表达式
[打印本页]
作者:
heifachangcun
时间:
2018-11-26 14:54
标题:
[石家庄校区] Lambda表达式
函数式编程思想: Lambda表达式
函数式编程思想概述
函数式:
在数学中, 函数就是有输入量, 输出量的一套计算方案, 也就是"传入什么东西, 得到什么结果" y = f(x)
面向对象与函数式的区别:
面向对象: 强调"用哪个对象的哪个方法"来做事 (注重语法形式: 继承 方法重写)
函数式: 强调"传入的参数 和 要执行的代码"
函数式编程的好处:
简化代码编写 (使用 λ Lambda表达式, 简化匿名内部类的代码)
Lambda标准格式
Lambda表达式的3个部分:
1. 一些参数 ():接口中抽象方法的参数列表. 没参数就空着; 有参数就写, 多个参数用逗号分隔
2. 一个箭头 -> :将参数传递给方法体
3. 一段代码 {} :重写接口抽象方法的方法体
格式:
// 写成多行
(数据类型 变量名, 数据类型 变量名) -> {
一些重写方法的代码
一些重写方法的代码
...
}
// 如果代码只有一行, 也可以合并写成一行
(参数列表) -> {一些重写方法的代码}
例子:
// 对数组排序
// 匿名内部类方式
/*Arrays.sort(arr,
new Comparator<Person>() {
@Override
public int compare
(Person o1, Person o2) {
return o1.getAge() - o2.getAge();
}
});*/
// Lambda标准格式
Arrays.sort(arr, (Person o1, Person o2) -> {
return o1.getAge() - o2.getAge();
});
// 打印排序后的结果
for (Person person : arr) {
System.out.println(person);
}
函数式接口:
函数式接口: "
有且仅有一个抽象方法
的接口"
但函数式接口对于 哪些方法算作抽象方法 有特殊规定:
1. 有
方法体
的方法"不算作"抽象方法, 如默认方法, 静态方法, 私有方法
2. 如果一个抽象方法 与 java.lang.Object类中的方法 定义相同的, 也"不算作"抽象方法
因为任何实现本接口的实现类, 都会直接或间接继承java.lang.Object类的public的方法, 所以在创建实现类时其实不用重写该抽象方法, 也就不算作抽象方法
Lambda省略格式和使用前提
省略原则:
"可推导的都可省略" (凡是能根据前后代码能猜测出来的代码, 都可以省略不写)
可以省略的部分:
1. (参数列表): 参数"类型"可以省略 (a, b) -> {}
2. (参数列表): 如果参数只有1个, 则"类型"和"小括号"都可以省略 a -> sout(a)
3. {一些代码}: 如果只有一条代码, 则"大括号", "return", "分号"省略必须"
一起省略
"
Lambda表达式的使用前提:
1. Lambda只能用于接口, 且"接口中有且仅有一个抽象方法"(也称为"函数式接口")
普通类, 抽象类不能用
2. 使用Lambda必须具有上下文推断
接口中只能有一个抽象方法, 才能推断出来重写的是这个抽象方法
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2