JDK8特性总结
Lambda表达式
- lambda表达式的作用就是简化了匿名内部类的写法
- 使用它的前提条件是接口中有且仅有一个抽象方法
- lambda表达式的标准格式是
(方法参数) -> {方法体}
,也还有一些省略的写法:- 方法参数中的参数类型可省略
- 如果方法参数中只有一个参数,那么小括号也可以省略
- 对于有返回值的方法,方法体中如果只有一条语句,大括号、return关键字和返回语句结尾的分号也可以省略
- lambda表达式和匿名内部类的区别:
- lambda表达式只能用于接口,而匿名内部类可以用于抽象类、接口
- lambda表达式中接口有且仅有一个抽象方法,而匿名内部类对抽象方法的数量没有限制
- 在接口中使用
@FunctionalInterface
注解来标记接口是一个函数式接口,接口中有且仅有一个抽象方法
接口增强
- jdk8之前接口中只能有静态常量和抽象方法
- jdk8允许接口中存在默认方法和静态方法,新增这两个方法的目的就是为了接口的扩展性,因为我如果现在想往一个接口中新增方法,那么该接口的所有实现类都需要重写新增的方法,十分麻烦,如果接口中新增默认方法和静态方法那么实现类也就不需要重写了。
- 默认方法,接口的实现类可以选择要不要重写新增的默认方法,也可以不重写。默认方法需要对象来调用
- 静态方法,它只能使用接口名来调用,不能使用对象来调用
常见函数式接口
- jdk为我们提供很多的函数式接口的目的是:我们使用lambda表达式的前提是接口必须是函数式接口,那么我们每一次使用都需要去创建这样一个接口,为了避免这种情况,jdk8的时候为了提供了很多常见的函数式接口。当然,一些特殊的场景还是需要自己去创建接口,
- lambda表达式不关心接口名和抽象方法名,只关心方法参数和返回值。
- 接下来举例一些常见的函数式接口:
- Consumer接口:典型的消费者接口,该接口有一个参数,没有返回值
- Supplier接口: 提供者接口,该接口无参,但有返回值
- Function接口:有参数有返回值
- Predicate接口:有参数,并且返回值是一个boolean类型
方法引用
- 目的:lambda表达式的出现是减少匿名内部类的冗余代码,但是有一些场景下lambda表达式中方法体中的代码也很多,并且具体方法的业务逻辑和其他方法一样,为了减少lambda表达式的冗余代码,就可以采用方法引用
- 方法引用的前提是,接口中抽象方法的参数和返回值必须要和被引用方法一致
- 方法引用的几种方式如下:
- 实例对象::普通方法
- 类名::静态方法
- 类名::普通方法 这种方式其实就是拿方法的第一个参数作为方法的调用者
- 类名::构造方法 这种方式的另一种写法是 类名::new
- 数组::构造方法
Steam流
-
Stream流出现的目的是:提高对集合数据的处理的性能以及便利。
-
获取Stream流的方式:
- Collection接口中的默认方法stream(),可以让list集合和set集合直接调用该方法获取到stream流
- map集合需要先转换为set集合,然后再调用stream()方法
- 如果是数组,需要调用Stream接口中的静态方法of(),
-
Stream的常用方法:count() 、foreach() 、filter() 、limit() 、skip() 、map() 、concat()
-
stream注意事项:
- stream只能操作一次
- stream方法返回的是最新的流
- stream不调用终结方法,中间的操作不会执行,终结方法就是count() 和 foreach()两个方法
-
常用方法:
- count() 计数
- foreach() 遍历
- filter() 过滤
- map() 类型转换
- limit() 取前几个元素
- skip() 跳过前几个元素
- concat() 组合
- sorted() 排序
- distinct() 去重
- mapToInt() 包装类转换为基本类型
- reduce() 归纳
- collect() 数据收集,其中有收集到集合、数组;分组;聚合;分区;拼接等操作
-
串行流
-
获取方式:调用Collection接口中的默认静态方法
parallelStream()
或者将串行流转换为并行流parallel()
-
线程安全问题:加同步锁或使用线程安全的集合
-
-
Fork/Join框架
- 核心原理——分治法
- 核心原理——任务窃取
Optional
- 创建Optional对象的方式:调用
Optional.of() Optional.ofNullable() Optional.empty()
- 常用方法
- get()
- isPresont()
- ifPresont()
- orElse()
- orElseGet()
- map
日期时间
-
JDK1.8 提供新的日期时间对象为
LocalDate LocalTime LocalDateTime
-
对象的创建方法:
now() of()
-
日期时间对象的修改:
withXXXX()
plusXXX()
minusXXXX()
-
日期对象的比较:
isAfter() isBefore()
-
格式化与解析
localDateTime.format(DateTimeFormatter d) LocalDateTime.parse("XXX", DateTimeFormatter d)
-
日期时间的差:
Duration Period
-
时区
ZonedDateTime