【1】请说一下JDK8有哪些特性?
接口新增静态方法、默认方法、新日期API、Lambda表达式、函数式接口、方法引用、StreamAPI、Optional类。
【2】介绍一下日期新增API
JDK8中主要新增了如下类,Instant、Duration、Period、LocalDate、LocalTime、LocalDateTime类、ZoneDateTime;各自功能如下:
- LocalDate:是一个不可变得本地日期对象,表示年月日,具有本地时区的偏移量,但无时区信息
- LocalTime:是一个不可变得本地时间对象,表示时分秒,具有本地时区的偏移量,但无时区信息
- LocalDateTime:是一个不可变的本地日期时间对象,表示年月日时分秒,具有本地时区的偏移量,但无时区信息
- ZonedDateTime:是一个不可变的时间对象,表示年月日时分秒,具有时区的偏移量,具有时区信息
- Instant:是一个瞬时类表示时间戳,不具有时区偏移量,不具有时区信息;可作为日期对象的中间转换对象。
- Period:Period类表示一段时间的年月日时分秒,用于较为复杂的一段时间计算
- Duration:Duration表示秒或纳秒时间间隔,适合处理较短的时间,需要更高的精确性的需求,例如秒杀;其中LocalDate、LocalTime、LocalDateTime的常用方法有初始化:now,of计算方法有:plusXXX,minusXXX
【3】介绍一下lambda表达式?
Lambda是一个匿名函数,我们可以把Lambda表达式理解为是一段可以传递的代码(将代码像数据一样进行传递),它可以简化函数式接口编程。其语法是:类型 变量名 = (参数列表)->{代码}。
【4】介绍一下什么是函数式接口?
只包含一个抽象方法的接口,称为函数式接口,可以通过Lambda表达式来创建接口的对象。我们可以在一个接口上使用@FunctionalInterface注解,这样做可以检查它是否是一个函数式接口。
【5】常见函数式接口有哪些?
- Consumer<T>消费型接口,void accept(T t)
- Supplier<T>供给型接口,T get()
- Function<T,R>函数型接口R apply(T t)
- Predicate<T>断定型接口boolean test(T t)
【6】介绍一下方法引用?
当要传递给Lambda体的操作,已经有实现的方法了,可以使用方法引用,如:
Consumer<String> consumer2 = (t) -> System.out.println(t);
Consumer<String> consumer3 = System.out::println;
【7】介绍一下StreamAPI?
StreamAPI是一套基于集合、数组的集合流操作,是面向CPU集合计算;Stream计算需要三个操作:创建Stream、中间操作、终止操作。
常见创建操作有:集合.stream();Arrays.stream(数组),Stream.of()
常见的中间操作有:filter、limit、map、sorted等
常见的终止操作有:count、max、forEach、collect等