体验Lambda表达式

函数式编程思想,简称λ,全称是Lambda

函数:有输出量、输出量的一套计算方案,也就是"拿数据做操作"

因为Java是面向对象的语言,所以对于Java来说,强调的是"必须通过对象的形式来做事情"

而函数式思想则尽量忽略面向对象的复杂语法,强调的是"强调做什么,而不是以什么形式去做"

对于我们将要学习的Lambda表达式就是函数式思想的体现

 

需求:启动一个线程,在控制台输出一句话:多线程程序启动了 提示:采用实现类的方式

 

方式1如下 1、定义一个类MyRunnable实现Runnable接口,重写run()方法 2、创建MyRunnable类的对象 3、创建Thread类的对象,把MyRunnable的对象作为构造参数传递 4、启动线程

 

方式2如下 1、匿名内部类的方式改进

 

方式3如下 1、Lambda表达式的方式改进

 

体验Lambda表达式的练习

 

Lambda表达式的标准格式

格式如下:

格式范例:

参数解释:

():里面没有内容,可以看成是方法形式参数为空。如果有多个参数,参数之间用逗号隔开;如果没有参数,留空即可

->:用箭头指向后面要做的事情

{}:包含一段代码,我们称之为代码块,可以看成是方法体中的内容

组成Lambda表达式的三要素:形式参数、箭头、代码块

 

Lambda表达式_抽象方法无参无返回值

Lambda表达式的使用前提: 1、有一个接口 2、接口中有且仅有一个抽象方法

练习: 1、定义一个接口(Eatable),里面定义了一个抽象方法:void eat() 2、定义一个测试类,在测试类中提供两个方法,一个方法是useEatable(a_3_1Eatable e),另一个方法是主方法且在主方法中调用useEatable方法

我们首先要有一个接口a_3_1Eatable,接口里面有且仅有一个抽象方法eat()。 并在测试类中定义一个useEatable方法,且useEatable方法要使用该接口a_3_1Eatable 其中,如果是'使用实现类的方式来调用useEatable方法',则还需要新建一个'a_3_3EatableImpl'类,'a_3_3EatableImpl‘就是a_3_1Eatable接口的实现类 其中,如果是'使用匿名内部类的方式’或'使用Lambda表达式的方式',就不需要使用到那个新建的a_3_3EatableImpl'类

 

Lambda表达式_抽象方法无参无返回值的练习

 

Lambda表达式_抽象方法带参无返回值

注意:其实就是前面的内容,即"a_3_0"~"a_3_3"的内容,为了能有熟悉感,我注释都基本写的一样

练习: 1、定义一个接口(Flyable),里面定义了一个抽象方法:void fly(String s) 2、定义一个测试类,在测试类中提供两个方法,一个方法是useFlyable(a_4_1Flyable f),另一个方法是主方法且在主方法中调用useFlyable方法

其实就是"a_3_0"~"a_3_3"的进阶版,同样也是演示三种方式是如何调用'接口的实现类'的方法,'接口的实现类'这里对应的就是'a_4_3FlyableImpl' 区别就是,这节课的'a_4_1Flyable'接口是带参的抽象方法,当使用'Lambda表达式的方式'的时候,注意在箭头前面的小括号里面写参数就行

我们首先要有一个接口a_4_1Flyable,接口里面有且仅有一个带参抽象方法fly(String s)。 并在测试类中定义一个useFlyable方法,且useFlyable方法要使用该接口a_4_1Flyable 其中,如果是'使用实现类的方式来调用useFlyable方法',则还需要新建一个'a_4_3FlyableImpl'类,'a_4_3FlyableImpl‘就是a_4_1Flyable接口的实现类 其中,如果是'使用匿名内部类的方式’或'使用Lambda表达式的方式',就不需要使用到那个新建的a_4_3FlyableImpl类,注意箭头前面的小括号里面写参数就行

 

Lambda表达式_抽象方法带参无返回值的练习

 

Lambda表达式_抽象方法带参带返回值

其实就是前面的内容,即"a_4_0"~"a_4_3"的内容,为了能有熟悉感,我注释都基本写的一样

练习: 1、定义一个接口(Addable),里面定义了一个抽象方法:int add(int x,int y) 2、定义一个测试类,在测试类中提供两个方法,一个方法是useAddable(Addable a),另一个方法是主方法且在主方法中调用useAddable方法 注意:这次的抽象方法add是需要两个int类型的参数,并返回一个int类型的结果

其实就是"a_4_0"~"a_4_3"的进阶版,同样也是演示三种方式是如何调用'接口的实现类'的方法,'接口的实现类'这里对应的就是'a_5_3AddableImpl' 区别就是,这节课的'a_5_1Addable'接口是带参带返回值的抽象方法,当使用'Lambda表达式的方式'的时候,注意在箭头前面的小括号里面写参数,方法体中注意返回值

我们首先要有一个接口a_5_1Addable,接口里面有且仅有一个带参带返回值抽象方法add(int x,int y)。 并在测试类中定义一个useAddable方法,且useAddable方法要使用该接口a_5_1Addable 其中,如果是'使用实现类的方式来调用useAddable方法',则还需要新建一个'a_5_3AddableImpl'类,'a_5_3AddableImpl‘就是a_5_1Addable接口的实现类 其中,如果是'使用匿名内部类的方式’或'使用Lambda表达式的方式',就不需要使用到那个新建的a_5_3AddableImpl类,注意箭头前面的小括号里面写参数,方法体中注意返回值

 

Lambda表达式_抽象方法带参带返回值的练习

 

Lambda表达式的省略模式

省略规则: 1、参数类型可以省略。但是有多个参数的情况下,不能只省略一个 2、如果参数有且仅有一个,那么小括号可以省略 3、如果代码块的语句只有一条,可以省略大括号和分号。且如果还有return,省略大括号和分号之后还一定要省略return

 

Lambda表达式省略模式的练习

 

Lambda表达式的注意事项

 

Lambda表达式和匿名内部类的区别

第一个区别:方法形参的所需类型不同 1、匿名内部类:可以是接口类、抽象类、具体类 2、Lambda表达式:只能是接口

第二个区别:使用限制不同 1、如果接口中有且仅有一个抽象方法,可以使用Lambda表达式,也可以使用匿名内部类 2、如果接口中多于1个抽象方法,只能使用匿名内部类,而不能使用Lambda表达式

第三个区别:实现原理不同 1、匿名内部类:运行编译之后,产生一个单独的.class字节码文件 2、Lambda表达式:运行编译之后,不会产生一个单独的.class字节码文件。原因:对应的字节码会在运行的时候动态生成

 

Lambda表达式和匿名内部类区别的练习