jdk1.8新特性知识点:
- Lambda表达式
- Stream API
- 函数式接口
- 方法引用和构造器调用
- 接口中的默认方法和静态方法
- 新时间日期API
- default
Lambda表达式
Lambda就是把我们之前一些复杂的代码更简单化,比如集合内容的判断比较/排序,我们之前可以进行遍历判断取出我们想要的数据或者写一个匿名内部类compareto等方法进行取出我们想要的数据,实际它们内部也就是进行了一些判断比较最终返回给了我们想要的结果。
举例:场景一
现在我们有三个用户 小明、小红、小强 他们的年龄分别是16, 18,20,现在我们要把这三个用户按年龄进行从小到大的排序。
如果按原来的写法,我们首先想到的应该是 编写匿名内部类Comparator进行比较然后排序得到我们想要的结果吧,附图:
举例:场景二
我们现在要对三个用户进行筛选,得到年龄是大于16岁的用户,我们首先想到的应该是进行遍历集合进行判断筛选,最后放入到一个新的集合吧,附图:
现在JDK1.8给我们提供了新的方式Lambda表达式,比上边的两个例子编写的代码更为简单更简介,下面我们来看一看怎么比上边的代码更简单。
场景一:附图
场景二:附图
下边是Lmabda表达式的语法总结:
口诀:左右遇一省括号,左侧推断类型省
注:当一个接口中存在多个抽象方法时,如果使用lambda表达式,并不能智能匹配对应的抽象方法,因此引入了函数式接口的概念。
先介绍一下Stream API,上边提到了Stream API,挨着写,下一个介绍函数式接口。
Stream API:
Stream 是 Java8 中处理集合的关键抽象概念,它可以指定你希望对集合进行的操作,可以执行非常复杂的查找、过滤和映射数据等操作。使用Stream API 对集合数据进行操作,就类似于使用 SQL 执行的数据库查询。也可以使用 Stream API 来并行执行操作。简单来说,Stream API 提供了一种高效且易于使用的处理数据的方式。
注意:1.Stream不会自己存储元素
2.Stream不会改变源对象,相反他们会返回一个持有新结果集的Stream对象。
3.Stream的操作是延迟执行的,这意味着他们会等到需要结果的时候才执行
4. 只有当作终止操作时,所有的中间操作会一次性的全部执行,称为“惰性求值”、“延迟加载”
5. 每一个Stream流只能操作一次,如果第二次操作会报错stream has already been operated upon or closed
Stream API的执行流程:
直接上代码:
1.创建流Stream
2.中间操作
3.终止操作
还有功能比较强大的两个终止操作 reduce和collect
reduce操作: reduce:(T identity,BinaryOperator)/reduce(BinaryOperator)-可以将流中元素反复结合起来,得到一个值
collect操作:Collect-将流转换为其他形式,接收一个Collection接口的实现,用于给Stream中元素做汇总的方法,转换为一个新的集合或者对象
函数式接口:
函数式接口的提出是为了给Lambda表达式的使用提供更好的支持。
什么是函数式接口?
简单来说就是只定义了一个抽象方法的接口(Object类的public方法除外),就是函数式接口,并且还提供了注解:@FunctionalInterface
函数式接口(Functional Interface)就是一个有且仅有一个抽象方法,但是可以有多个非抽象方法的接口。
函数式接口可以被隐式转换为 lambda 表达式。
Lambda 表达式和方法引用(实际上也可认为是Lambda表达式)上。
常见的四大函数式接口有:
Consumer 《T》:消费型接口,有参无返回值
Supplier 《T》:供给型接口,无参有返回值
Function 《T,R》:函数式接口,有参有返回值
Predicate《T》:断言型接口,有参有返回值,返回值是boolean类型
在四大核心函数式接口基础上,还提供了诸如BiFunction、BinaryOperation、toIntFunction等扩展的函数式接口,都是在这四种函数式接口上扩展而来的,不做赘述。
总结:函数式接口的提出是为了让我们更加方便的使用lambda表达式,不需要自己再手动创建一个函数式接口,直接拿来用就好了,详细接口描述在下边。
方法引用:
若lambda体中的内容有方法已经实现了,那么可以使用“方法引用”也可以理解为方法引用是lambda表达式的另外一种表现形式并且其语法比lambda表达式更加简单
(a) 方法引用
三种表现形式:
1. 对象:实例方法名
2. 类::静态方法名
3. 类::实例方法名 (lambda参数列表中第一个参数是实例方法的调用 者,第二个参数是实例方法的参数时可用)
(b)构造器引用
格式:ClassName::new
(c)数组引用
格式:Type[]::new