java基础语法大纲
一、Lambda 表达式
1.1.概述:
- 1.
Lambda 是一个匿名函数
,我们可以把 Lambda 表达式理解为是一段可以传递的代码
(将代码像数据一样进行传递) - 2.使用Lambda 表达式可以写出更简洁、更灵活的代码。作为一种更紧凑的代码风格,使Java的语言表达能力得到了提升
- 3.Lambda 表达式的本质
就是函数式接口的实例
- 一方面Lambda 表达式作为接口的实现类的对象
- 另一方面Lambda 表达式是一个匿名函数
- 一方面Lambda 表达式作为接口的实现类的对象
1.2.语法:
- 1.在Java 8 语言中引入的一种新的语法元素和操作符
->
,该操作符被称为 Lambda 操作符或箭头操作符
。它将 Lambda 分为两个部分:左侧
:指定 Lambda 表达式需要的参数列表
,就是接口中抽象方法的形参列表右侧
:指定 Lambda 体,是抽象方法的实现逻辑,就是抽象方法的方法体、即Lambda 表达式要执行的功能
1.3.体会:将冗余的匿名内部类转Lambda表达式:
a.案例1:实现多线程转匿名函数:
第1步:实现启动线程:
- 1.当需要启动一个线程去完成任务时:
- 首先通过
java.lang.Runnable
接口来定义任务内容 - 然后使用
java.lang.Thread
类来启动该线程。代码如下:
- 首先通过
package com.atguigu.fp;public class UseFunctionalProgramming {public static void main(String[] args) {new Thread(new Runnable() {@Overridepublic void run() {System.out.println("多线程任务执行!");}}).start(); // 启动线程}
}
代码分析: 对于
Runnable
的匿名内部类用法,可以分析出几点内容:
Thread
类需要Runnable
接口作为参数,其中的抽象run
方法是用来指定线程任务内容的核心:- 为了指定
run
的方法体,不得不需要Runnable
接口的实现类; - 为了省去定义一个
RunnableImpl
实现类的麻烦,不得不使用匿名内部类; - 必须覆盖重写抽象
run
方法,所以方法名称、方法参数、方法返回值不得不再写一遍,且不能写错;
- 为了指定
- 实际上,似乎只有方法体才是关键所在
从匿名类到 Lambda 的转换举例:
- 匿名内部类转Lambda表达式:
b.案例2:TreeSet案例:
c.案例3:比较器Comparator():
- 1.匿名函数类:
- 2.Lambda形式:
- 3.方法应用形式:
二、在6种情况下Lambda 表达式使用:
情况1:无参,无返回值
a.语法:
b.案例:
情况2:Lambda 需要一个参数,但是没有返回值
a.语法:
b.案例:
情况3:数据类型可以省略,因为可由编译器推断得出,称为“类型推断”
a.语法:
b.举例:
情况4:Lambda 若只需要一个参数时,参数的小括号可以省略
a.语法:
b.举例:
情况5:Lambda 需要两个或以上的参数,多条执行语句,并且可以有返回值
a.语法:
b.举例:
情况6:当 Lambda 体只有一条语句时,return 与大括号若有,都可以省略
a.语法:
b.举例:
类型推断说明:
- 1.在Lambda 表达式中的
参数类型都是由编译器推断得出的
。Lambda表达式中无需指定类型,程序依然可以编译,这是因为javac 根据程序的上下文,在后台推断出了参数的类型
。 - 2.Lambda 表达式的类型依赖于上下文环境,是由编译器推断出来的。这就是所谓的“类型推断”。