java8新特性
- 速度更快
- 代码更少(增加了新的语法Lambda表达式)
强大的Stream API
便于并行
最大化减少空指针异常 Optional
Lambda基础语法
Lambda 表达式的基础语法: java8中引入了一个新的操作符 “->” 该操作符为箭头操作符或Lambda操作符
箭头操作符讲Lambda表达式拆分成两部分;左侧: Lambda 表达式的参数列表
右侧: Lambda 表达式中所执行的功能,即Lambda体
- 语法格式一 : 无参数,无返回值
() -> System.out.println(“hello”)- 语法格式二 : 有一个参数,并且无返回值
(x) -> System.out.println(x)- 语法格式三 : 若只有一个参数,小括号可以省略不写
- 语法格式四: 有两个以上的参数,有返回值,并且Lambda体有多条语句
Comparator(Integer) com = (x,y) -> {
System.out.println(“hello”);
return Integer.compare(x,y);
} ;- 语法格式五: 若Lambda体中只有一条语句, return 和大括号都可以省略不写
Comparator com = (x,y) -> Integer.compare(x,y);- 语法格式六: Lambda表达式的参数列表的数据类型可以省略不写,因为JVM编译器通过上下文推断出,数据类型; 即"类型推断"
(Integer x,Integer y) -> Integer.compare(x,y);
内置的四大函数式接口
- Consumer :消费性接口
void accept(T t)- Supplier : 供给型接口
T get()- Function<T,R> :函数型接口
R apply(T t)- Predicte<T,R> : 断言型接口
boolean test(T t);
方法引用和构造器引用
- 方法引用: 若Lambda体中的内容有方法已经实现了,我们可以使用"方法引用"(可以理解为方法引用是Lambda 表达式的另外一种表现形式)
- 主要有三种语法格式:
- 对象::实例方法名
- 类:: 静态方法名
- 类:: 实例方法名
- 1.Lambda 体中调用方法的参数列表与返回值类型,要与函数式接口中抽象方法的函数列表和返回值类型保持一致
- 2.若Lambda 参数列表中的第一个参数是 实例方法的调用者,而第二个参数是实例方法的参数时,可以使用ClassName :: method
- 构造器引用
- 格式 :
ClassNeme :: new
注意: 需要调用的构造器的参数列表要与函数式接口中的抽象方法的参数列表保持一致
- 数组引用
- Type::new
Stream API
- 流(Stream) 是数据渠道,用于操作数据源(集合,数组等) 所生成的元素序列.
- 集合讲的是数据,流讲的是计算!
- 注意:
- Stream 自己不会存储元素
- Stream 不会改变源对象. 相反,他们会返回一个持有结果的新Stream.
- 3.Stream 操作是延迟执行的. 这意味着他们会等到需要结果的时候才执行.
Stream 的操作三个步骤
- 创建Stream
- 中间操作
- 终止操作
- 一.创建Stream
- 可以通过Collection 系列集合通过的Stream() 或 parallelStream()
list.stream()- 通过Arrays 中的静态方法Stream()
Arrays.stream(arr);- 通过Stream 类中的静态方法 of()
Stream.of(“aa”,“bb”)- 创建无限流
迭代–> Stream.iterate(0, (x) -> x+2)
生成–> Stream .generate(() -> Math.random());
- 二.中间操作
中间操作不会执行任何的处理,而在终止操作是一次性全部处理,称为"惰性求值"
内部迭代: 迭代操作由Stream API完成
- . 筛选与切片
- filter–接受Lambda,从流中排出某些元素.
- limit–阶段流,使其元素不超过给定数量
- skip(n) – 跳过元素,返回一个扔掉的前n个元素的流若流中元素不足n个,则返回一个空流.与limit(n) 互补
- distinct – 筛选,通过流所生成元素的hashCode() 和equals()
- 映射
- map – 接受Lambda, 将元素转换成其他形式或提取信息.接受一个函数作为参数,改参数会被应用到每个元素上,并将其映射成一个新的元素.
- flatMap – 接受一个函数作为参数,将流中的每个值都换成另一个流,然后把所有流连接成一个流
- 排序
- sorted() – 自然排序
- sored(Comparator com) – 定制排序(Comparetor)
- 三.终止操作
- 查找与匹配
- allMatch-- 检查是否匹配所有元素
- anyMatch-- 检查是够至少匹配一个元素
- noneMatch-- 检查是否没有匹配所有元素
- findFirst-- 返回第一个元素
- findAny-- 返回当前流中任意元素
- count-- 返回六中元素的总个数
- max-- 返回流中最大值
- min-- 返回流中最小值
- 规约
- reduce(T identity,BinaryOption) / reduce(BinaryOperator) – 可以将流中元素反复结合起来,得到一个值.
- 收集
- collect – 将流转换为其他形式,接收一个Collector接口的实现,用于给Stream中元素做汇总的方法
并行流和顺行流
Optional类
Option 类是一个容器类,代表一个值存在或不存在,原来用null表示一个值不存在
- Optional 容器类的常用方法
- Optional.of(T t) : 创建一个Optional实例
- Optional.empty() : 创建一个空的Optional 实例
- Optional.ofNullable(T t) : 若t不为null,创建Optional 实例,否则创建空实例
- isPresent() 判断是否包含值
- orElse(T t) 如果调用对象包含值,返回该值,否则返回s获取的值
- orElseGet(Supplier s) : 如果调用对象包含值,返回该值,否则返回s获取的值
- map(Function f) : 如果有值对其处理,并返回处理后的Optional,否则返回Optional.empty()
- flatMap(Function mapper) : 与map类似,要求返回值必须是Optional
- 接口中的默认方法与静态方法
接口默认方法的"类优先"原则
新时间日期API
- LocalDate LocalTime LocalDateTime
LocalDateTime ldt = LocalDateTime.now() 获取当前时间
ldt.plusYears(2) 加2年
ldt.minusMonths(2) 减2月- Instant : 时间戳(以Unix元年: 1970年1月1日 00:00:00 到某个时间之间的毫秒值)
Instant ins = Instant.now() 默认获取UTC时区
ins1.atOffset(ZoneOffset.ofHours(8))- Duration : 计算两个 时间 之间的间隔
Period : 计算两个 日期 之间的间隔- TemporalAdjuster : 时间校正器
- DateTimeFormatter : 格式化时间/日期
DateTimeFormatter.ofPattern(“yyyyMMdd”);- ZoneDate ZoneTime ZoneDateTime
LocalDateTIme.now(ZoneId.of(“Eurpope/Tallinn”)