Java8新特性

文章目录

  • 一、Lambda表达式
    • 1、概述
    • 2、语法
  • 二、函数式接口
  • 三、引用
    • 1、方法引用
    • 2、构造器引用
    • 3、数组引用
  • 四、Stream API
    • 1、概念
    • 2、步骤
      • a、创建Stream
      • b、中间操作
      • c、终止操作
    • 3、并行流与串行流
    • 4、Fork/Join 框架
      • a、概念
      • b、Fork/Join 框架与传统线程池的区别
  • 五、Optional类
    • 1、概念
    • 2、常用方法:
  • 六、新的日期时间API
    • 1、LocalDate、LocalTime、LocalDateTime
    • 2、Instant
    • 3、Duration 和 Period
    • 4、日期的操纵
    • 5、解析与格式化
    • 6、时区的处理
    • 7、与传统日期处理的转换
  • 七、默认方法
  • 八、静态方法

一、Lambda表达式

1、概述

  • Lambda 是一个匿名函数
  • 可以理解为是一段可以传递的代码
  • 将代码像数据一样进行传递

从匿名内部类到Lambda表达式的转换
Java8新特性_第1张图片Java8新特性_第2张图片

2、语法

操作符:->

  • 左侧:指定了Lambda表达式需要的所有参数
  • 右侧:指定了Lambda体,即要执行的功能

语法

  • 可选类型声明:不需要声明参数类型,编译器可以推断识别参数值

  • 可选的参数圆括号:一个参数无需定义圆括号,但多个参数需要定义圆括号

  • 可选的大括号:如果主体包含了一个语句,就不需要使用大括号和return

  • 可选的返回关键字:如果主体只有一个表达式返回值则编译器会自动返回值,大括号需要指定明表达式返回了一个数值

二、函数式接口

  • 只包含一个抽象方法的接口
  • 可以使用 @FunctionalInterface 注解检查
  • Lambda必须和函数式接口配合:接口如果有多个函数,则无法确定实现的是哪个

Java8新特性_第3张图片
Java8新特性_第4张图片

三、引用

1、方法引用

使用场景:当要传递给Lambda体的操作,已经有实现的方法时

方法引用:使用操作符 :: 将方法名和对象或类的名字分隔开来

如下三种主要使用情况:
Java8新特性_第5张图片

2、构造器引用

格式:类 :: new
在这里插入图片描述

3、数组引用

格式:type[] :: new
在这里插入图片描述

四、Stream API

1、概念

  • Stream是数据渠道,用于操作数据源所生成的元素序列
  • 集合讲的是数据,流讲的是计算
  • Stream本身不会存储元素
  • Stream不会改变源对象
  • Stream操作是延迟执行的:等到需要结果的时候才执行

2、步骤

  1. 创建Stream:获取一个流
  2. 中间操作:对数据源的数据进行处理
  3. 终止操作(终端操作):执行中间操作链,并产生结果

Java8新特性_第6张图片

a、创建Stream

Java8中Collection接口被扩展,提供了两个获取流的方法:

  • default Stream stream():返回一个顺序流
  • default Stream parallelStream():返回一个并行流

由数组创建流:
Java8新特性_第7张图片
由值创建流:
Java8新特性_第8张图片
由函数创建流:创建无限流:
Java8新特性_第9张图片
Java8新特性_第10张图片

b、中间操作

  • 多个中间操作可以连接起来形成一个流水线,除非流水线上触发终止操作
  • 否则中间操作不会执行任何的处理!
  • 而在终止操作时一次性全部处理,称为“惰性求值”。

筛选和切片
Java8新特性_第11张图片
映射
Java8新特性_第12张图片
flatMap:解决流中嵌套流比如{ {a,a,a},{b,b,b}},它会把这些流转换成一个流{a,a,a,b,b,b}方便处理

排序
Java8新特性_第13张图片

c、终止操作

查找与匹配
Java8新特性_第14张图片
Java8新特性_第15张图片

归约
在这里插入图片描述
备注:map 和 reduce 的连接通常称为 map-reduce 模式,因 Google 用它来进行网络搜索而出名。

收集
在这里插入图片描述

  • Collector 接口中方法的实现决定了如何对流执行收集操作(如收集到 List、Set、Map)
  • 但是 Collectors 实用类提供了很多静态方法
  • 可以方便地创建常见收集器实例,具体方法与实例如下表:

Java8新特性_第16张图片
Java8新特性_第17张图片

3、并行流与串行流

  • 并行流就是把一个内容分成多个数据块
    并用不同的线程分别处理每个数据块的流
  • Java 8 中将并行进行了优化
    我们可以很容易的对数据进行并行操作
  • Stream API 可以声明性地通过 parallel() 与
    sequential() 在并行流与顺序流之间进行切换

4、Fork/Join 框架

a、概念

  • 在必要的情况下,将一个大任务
  • 进行拆分(fork)成若干个小任务(拆到不可再拆时)
  • 再将一个个的小任务运算的结果进行 join 汇总

Java8新特性_第18张图片

b、Fork/Join 框架与传统线程池的区别

采用 “工作窃取”模式(work-stealing):

  • 当执行新的任务时它可以将其拆分成更小的任务执行,并将小任务加到线程队列中
  • 然后再从一个随机线程的队列中偷一个并把它放在自己的队列中
  • 相对于一般的线程池实现
  • fork/join框架的优势体现在对其中包含的任务的处理方式上
  • 在一般的线程池中,如果一个线程正在执行的任务由于某些原因无法继续运行,那么该线程会处于等待状态
  • 而在fork/join框架实现中,如果某个子问题由于等待另外一个子问题的完成而无法继续运行
  • 那么处理该子问题的线程会主动寻找其他尚未运行的子问题来执行
  • 这种方式减少了线程的等待时间,提高了性能.

五、Optional类

1、概念

  • Optional 类(java.util.Optional) 是一个容器类,代表一个值存在或不存在
  • 原来用 null 表示一个值不存在,现在 Optional 可以更好的表达这个概念。并且可以避免空指针异常

2、常用方法:

  • Optional.of(T t) : 创建一个 Optional 实例
  • Optional.empty() : 创建一个空的 Optional 实例
  • Optional.ofNullable(T t):若 t 不为 null,创建 Optional 实例,否则创建空实例
  • isPresent() : 判断是否包含值
  • orElse(T t) : 如果调用对象包含值,返回该值,否则返回t
  • orElseGet(Supplier s) :如果调用对象包含值,返回该值,否则返回 s 获取的值
  • map(Function f): 如果有值对其处理,并返回处理后的Optional,否则返回 Optional.empty()
  • flatMap(Function mapper):与 map 类似,要求返回值必须是Optional

六、新的日期时间API

1、LocalDate、LocalTime、LocalDateTime

  • LocalDate、LocalTime、LocalDateTime 类的实例是不可变的对象
  • 分别表示使用 ISO-8601日历系统的日期、时间、日期和时间
  • 它们提供了简单的日期或时间,并不包含当前的时间信息。也不包含与时区相关的信息。
  • 注:ISO-8601日历系统是国际标准化组织制定的现代公民的日期和时间的表示

Java8新特性_第19张图片

2、Instant

  • 用于“时间戳”的运算。
  • 它是以Unix元年(传统的设定为UTC时区1970年1月1日午夜时分)
  • 开始所经历的描述进行运算

3、Duration 和 Period

  • Duration:用于计算两个“时间”间隔
  • Period:用于计算两个“日期”间隔

4、日期的操纵

  • TemporalAdjuster : 时间校正器
    有时我们可能需要获取
    例如:将日期调整到“下个周日”等操作
  • emporalAdjusters :
    该类通过静态方法提供了大量的常见TemporalAdjuster 的实现。

Java8新特性_第20张图片

5、解析与格式化

java.time.format.DateTimeFormatter 类:

该类提供了三种格式化方法:

  1. 预定义的标准格式
  2. 语言环境相关的格式
  3. 自定义的格式

6、时区的处理

  • Java8 中加入了对时区的支持,带时区的时间为分别为:
  • ZonedDate、ZonedTime、ZonedDateTime
  • 其中每个时区都对应着 ID,地区ID都为 “{区域}/{城市}”的格式
  • 例如 :Asia/Shanghai 等
  • ZoneId:该类中包含了所有的时区信息
    getAvailableZoneIds() : 可以获取所有时区时区信息
    of(id) : 用指定的时区信息获取 ZoneId 对象

7、与传统日期处理的转换

Java8新特性_第21张图片

七、默认方法

  • Java 8中允许接口中包含具有具体实现的方法
  • 该方法称为“默认方法”
  • 默认方法使用 default 关键字修饰

Java8新特性_第22张图片

接口默认方法的”类优先”原则:

  • 若一个接口中定义了一个默认方法,而另外一个父类或接口中又定义了一个同名的方法时
  • 选择父类中的方法:
    如果一个父类提供了具体的实现
    那么接口中具有相同名称和参数的默认方法会被忽略
  • 接口冲突:
    如果一个父接口提供一个默认方法
    而另一个接口也提供了一个具有相同名称和参数列表的方法(不管方法是否是默认方法)
    那么必须覆盖该方法来解决冲突

Java8新特性_第23张图片
Java8新特性_第24张图片

八、静态方法

Java8 中,接口中允许添加静态方法
Java8新特性_第25张图片

你可能感兴趣的:(java)