一、Java新特性
1.1 Lambda表达式
- 概念:特殊的匿名内部类,语法更简洁,允许把函数作为一个方法的参数,将代码像数据一样传递
- 基本语法:
<函数式接口> <变量名> = (参数1,参数2)->{
};
- 注意事项:
* 形参列表的数据类型会自动推断
* 如果形参列表为空,只需保留()
* 如果形参只有一个,()可以省略,只需要参数的名称即可
* 如果执行语句只有一句,且无返回值,()可以省略,若有返回值,则若想省略{},必须同时省略return,且执行语句也保证只有一句
* Lambda不会生成一个单独的内部类文件
1.2 函数式接口
- 如果一个接口只有一个抽象方法,则该接口称之为函数式接口
- 函数式接口可以使用Lambda表达式,Lambda表达式会被匹配到这个抽象方法上
- 可以使用@FunctionalInterface注解检测接口是否符合函数式接口
- 常见的函数式接口:
* 消费型接口:Comsumer 有参数,无返回值
Consumer<String> consumer = s -> System.out.println(s);
consumer.accept("消费型接口");
* 供给型接口:Supplier<T> 无参数,有返回值
Supplier<String> supplier = () -> "供给型接口";
System.out.println(supplier.get());
* 函数型接口:Function<T,R> 有参数,有返回值
Function<Integer, Integer> function = a -> 2 * a;
System.out.println(function.apply(10));
* 断言型接口:Predicate<T> 有参数,返回值为boolean类型
Predicate<Integer> predicate = a -> a > 0;
System.out.println(predicate.test(5));
1.4 方法引用
- 方法引用是Lambda表达式的一种简写形式。如果Lambda表达式方法体中只是调用一个特定的已经存在的方法,则可以使用方法引用
Consumer<String> consumer = System.out::println;
consumer.accept("666");
Comparator<Integer> comparator = Integer::compare;
System.out.println(comparator.compare(25, 35));
Supplier<Student> supplier = Student::new;
System.out.println(supplier.get());
Function<String, String> function = String::toUpperCase;
System.out.println(function.apply("abc"));
1.5 Stream API
- 流(Stream)与集合类似,但集合中保存的是数据,而Stream中保存对集合或数组数据的操作
- 特点:
* Stream自己不会存储元素
* Stream不会改变源对象。相反,他们会返回一个持有结果的新Stream
* Stream操作是延迟执行的,会等到需要结果的时候才执行 - 使用步骤:
* 创建:
* 通过Collection对象的stream()或parallelStream()方法
* 通过ARRAYrray类的stream()方法
* 通过Stream接口的of()、itrate()、generate()方法
* 通过IntStream、LongStream、DoubleStream接口中的of、range、rangeClosed方法 - 中间操作:
* 在一个或多个步骤中,将初始Stream转化到另一个Stream的中间操作
* filter、limit、skip、distinct、sorted
* map
* parallel - 终止操作:
* 使用一个终止操作来产生一个结果。该操作会强制之前的延迟操作立即执行,在此之后,该Stream就不能使用了
* forEach、min、max、count
* reduce、collect
1.6 新的日期API
- 之前时间API存在问题:线程安全问题、设计混乱
- 本地化日期时间API:
* LocalDate
* LocalTime
* LocalDateTime - Instant:时间戳
- ZoneId:时区
- DateTimeFormatter:格式化类