123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566 |
- Lambda表达式
- C语言函数
- Java方法
- 数学中的函数 ,就是具有输入量、输出量的一套计算方案。也就是用数据进行操作。
- 面向对象的思想强调:必须要通过对象的形式来做事情。
- 函数式思想,尽量忽略面向对象的语法,更强调做什么?而不是用什么形式去做。
- lambda表达式就是函数式思想。
- 格式:
- (形式参数)->{
- 代码块(行为、操作、运算)
- }
- 形式参数:如果有多个参数,每个参数之间使用逗号隔开,没有参数就是空的。
- ->:是英文-和大于号组成。固定的写法。表示指向动作
- 代码块{}:表示我们具体要做的事情,也就是方法体内容。
- 组成lambda表达式的三要素:
- 形式参数、箭头、代码块
- lambda省略规则:
- 参数类型可以省略,但是如果有多个参数的情况下,不能只省略一个
- 一个参数,省略参数类型:
- //省略参数类型:
- useFlyable((s)->{
- System.out.println(s+"飞......");
- });
- 多个参数,省略参数类型
- useFlyable((s,s1)->{
- System.out.println(s+"飞......"+s1);
- });
- 如果参数有且只有一个那么可以省略小括号:
- useFlyable(s->{
- System.out.println(s+"飞......");
- });
- 如果代码块的语句只有一条,那么可以省略大括号和分号,和return关键字:
- useAddable((a,b)->a+b);
- 使用lambda表达式的前提条件,在什么条件下能使用lambda:
- 1、使用lambda表达式必须要有接口,抽象类都不行。
- 2、要求接口有且只有一个抽象方法。
- lambda表达式和匿名内部类的区别:
- 需要的类型不一样:
- 1、匿名内部类的父类可以是接口,也可以是抽象类,甚至可以是具体类。
- 2、lambda表达式:只能是接口
- 使用的限制不一样
- 如果接口中有且只有一个方法,那么可以使用lambda表达式,也可以使用匿名内部类
- 如果接口中有多个抽象方法,那么只能使用匿名内部类,不能使用lambda表达式
- 实现原理不一样
- 匿名内部类:归根结底还是一个单独的类,只不过这个类没有名字,只能使用一次。并且当编译之后,匿名内部类会产生一个单独的.class文件
- lambda表达式:编译之后,是不会编译出单独的.class字节码文件的,对应的字节码会在运行的时候动态生成。
- 当某个接口有且只有一个抽象方法,那么这个接口可以成为函数式接口。
|