Day25 1.8新特性
- Lambda
lambda表达式 是一种没有名字的函数,也可以称为闭包
用它可以写出更简洁、更灵活的代码。作为一种更紧凑的代码风格,使Java的语言表达能力得到了提升。允许把方法作为一个参数,进行传递
Lambda 操作符 “->”将Lambda 分为两个部分:
左侧:指定了Lambda 表达式需要的参数列表
右侧:指定了Lambda 体,即Lambda 表达式要执行的功能。
1.1.1语法特点
可选类型声明 : 不需要声明数据类型,编译器可以识别参数值
可选的参数()括号 : 一个参数无需定义括号,但是多个参数必须要定义括号
可选的大括号 : 如果主体内包含一个语句,就不需要大括号
可选的返回关键字 : 如果主体中只有一个表达式,并且是返回值语句的话,大括号中需要指明表达式返回的一个数据
如果只有一条语句,并且是返回值语句的话,return和{} 都可以不写
如果写上{} 那么 return和; 必须要写
如果有多条语句,必须写{} 和return;
- 函数式接口
Functional Interface:本质就是一个只有一个抽象方法,但是可以有多个非抽象方法的接口
核心目标就是为Lambda表达式的使用提供更好的支持,进一步达到函数式编程的目标,提高开发效率
2.1 特点
- 特点 :
-
函数式接口是仅指定一个抽象方法的接口
-
可以保护多个静态方法和默认方法
-
专用注解 @FunctionalInterface ,检查是否是一个函数式接口,也可以不写该注解
-
如果有两个或以上个抽象方法,就不能当做函数式接口去使用,同时也不能添加 @FunctionalInterface 这个注解
2.2 回调函数
简单来说,就是方法需要传入一个参数也是方法,并且在该方法中对这个传入的方法进行调用
2.3 JDK自带的函数式接口
2.3.1 Supplier
- Supplier 接口 : 表示供应商,所以有返回值,可以获取数据
- get方法
2.3.2 Consumer - Consumer 接口 : 表示消费者接口,所以不需要返回值
- accept(T t) 用于执行消费操作
2.3.3 Function - Function<T,R> 接口 表示接收一个参数,并产生一个结果
- R apply(T t) 方法
2.3.4 Predicate - Predicate 接口 断言接口,就是做一些判断
- booean test(T) 用于做校验比较操作
- 方法、构造器、数组
Lambda表达式的另一种表示形式,提高复用率和灵活性
3.1 特点
更简单,代码量更少,复用性和扩展性更高
对象::实例方法名
类::静态方法名
类::实例方法名
3.2 构造器引用
格式:ClassName::new
与函数式接口相结合,自动与函数式接口中方法兼容。
可以把构造器引用赋值给定义的方法,要求构造器参数列表要与接口中抽象方法的参数列表一致!且方法的返回值即为构造器对应类的对象。
3.3 数组引用
- StreamAPI
用来处理集合、数组的API,集合讲的是数据,而流是计算
注意:
①Stream 自己不会存储元素。
②Stream 不会改变源对象。相反,他们会返回一个持有结果的新Stream。
③Stream 操作是延迟执行的。这意味着他们会等到需要结果的时候才执行。
4.1 运行机制
Stream分为源source , 中间操作,终止操作
1-创建Stream
一个数据源(如:集合、数组),获取一个流
2-中间操作
一个中间操作链,对数据源的数据进行处理
一个流可以有0~N个中间操作,每一个中间操作都会返回一个新的流,方便下一个操作使用
一个流只能有一个终止操作
中间操作也称为转换算子-transformation
3-终止操作(终端操作)
一旦执行终止操作,就执行中间操作链,并产生结果。之后,不会再被使用
Stream只有遇到终止操作,它对数据源才会开始执行遍历等操作
终止操作也称为动作算子
因为动作算子的返回值不再是Stream,所以这个计算就终止
只有碰到动作算子的时候,才会真正的计算
4.2 创建Stream的五种方式
4.3 常用的中间操作-转换算子
4.3.1 常用的转换算子
- 常用的转换算子
- filter , distinct , map , limit , skip , flatMap等
- filter : 对元素进行过滤,不符合条件的,就不要了
- distinct : 去掉重复
- skip : 跳过多少个元素
- limit : 取一个集合中的前几条数据
- map : 可以理解为是在遍历集合的过程中,对元素进行操作
-
比如进行判断,集合元素是否大于4 ,返回值为boolean类型
-
或者对集合元素进行更改,比如每个元素都自身+1
- flatMap : 解决一个字符串数组,返回单一的字符串使用flatMap
- 注意 只有此算子是不会真正进行计算的,只有调用动作算子,才会真正计算
4.3.2 常见异常
Stream 使用之后,必须重新生成新的Stream,不能使用原来的stream
可以链式调用,是因为转换 算子的返回值都是一个新的Stream,而这个新的Stream还没有操作过 ,所以可以链式调用
但是原来的stream就不能再使用了,否则报错
4.4 常用的终止操作-动作算子
4.4.1 常用动作算子
- 常用的动作算子 :
- forEach : 循环
- 计算 : min,max,count,average
- 匹配 : anyMatch,allMatch,noneMatch,findFirst,findAny
- 汇聚 : reduce
- 收集器 : collect