java8新特性
1、 JAVA8的主要变化
• 新日期API
• 函数式编程
• 语法改进: lambda表达式,方法引用,默认方法…
• 新的类库: Stream, Optional…
• 已有API增强: collections..comparator
• Concurrent
• LongAdder & LongAccumulator
• CompletableFuture
• 其他
• 新JS引擎
• 重复注解
• API 增强
2、 新日期API
2.1 Instant 绝对时间。
Duration 时间段
2.2 ZonedDateTime LocalDateTime
日历时间,相对时间,API基本相同
区别:ZonedDateTime 是一个带时区的时间,LocalDateTime是不带时区的时间;有条件的话尽量带上时区
ZonedDateTime 提供许多便捷的方法如isAfter、时间的加减
2.3 DateTimeFormatter
日期的序列化和反序列化
2.4 TemporalAdjusters
日期格式的调整
3、 java 8 函数式编程
概论
• 理解 JAVA 8 函数式编程
语法核心问题:
• 函数可作为参数
• 函数可作为返回值
使用场景
Lambda 表达式语法
函数式接口
方法引用
Stream API
3.1 Lambda表达式语法
语法糖
• 省略大括号
• 省略参数括号
• 省略参数类型
3.2 Lambda 演算
自由变量访问规则: 最终不可变
3.3 函数式接口(SAM)
接口有默认静态方法
default void forEeach(Consumer<? Super T> action){
Objects.requireNonNull(action);
For(T t:this){
action.accept(T)}
}
3.4 方法引用
用::分割
• 引用实例方法
• 引用类定义上的任意对象实例方法
• 引用静态方法
• 引用构造函数
• void-compatibility rule
Consumer runnable不需要返回值,也可以调用有返回值的方法
参数是严格要求的
4、stream和list的区别
Stream 是一个无限的流,可以并行处理,Sream 只能消费一遍,描述了一个操作,最后累加在一起;
• filter/map/reduce
• collect
Stream 分为描述和终结
4.1 filter 滤除
4.2 map 映射,变换
4.3 reduce 对每个元素进行一些运算 acc累计值,curr当前值
reduce 实现list
reduce 实现map
4.4 sorted
sorted方法用于对流中的元素进行排序
List<Employee> sortedEmp = employees.stream().sorted(Comparator.comparing(Employee::getSalary)).collect(Collectors.toList());
4.4 函数式编程的利与弊
利:代码的维护性好、简洁
弊:过于抽象
4.5 transducer模式
5、CompletableFuture
• Future的局限性:
多个异步任务协作时,存在局限性
• 核心API:
completedFuture()/ [supply|run](Async) /
Then[apply|accept|run]([Both|Either]) (Async)
get() vs join()
future ,维护性查,调换一下顺序会影响并发。
completedFuture 提供一些描述性的概念,把逻辑描述清楚。
thenApply 告诉下一个function 是什么
Async 有的话是一步开始,没有的话执行完前一个任务再执行下一个。
get() vs join() 拿到结果
CompletableFuture 实现上述逻辑:
get 和 join的区别:
1).相同点:
join()和get()方法都是用来获取CompletableFuture异步之后的返回值
2).区别:
1.join()方法抛出的是uncheck异常(即未经检查的异常),不会强制开发者抛出,
会将异常包装成CompletionException异常 /CancellationException异常,但是本质原因还是代码内存在的真正的异常,
2.get()方法抛出的是经过检查的异常,ExecutionException, InterruptedException 需要用户手动处理(抛出或者 try catch)
allOf/anyOf
1)CompletableFufure.allof(CompletableFufure...c) 一组异步方法都执行成功时返回CompletableFuture方法。
2)CompletableFufure.anyOf( CompletableFufure...c )一组异步方法,有一个执行成功时就返回。
6、Optional
1>map 和 flatMap
flatMap 在option返回值为option,返回的是自己,stream返回stream
Functor & Monad
Functor ,通过map映射,不改变它的性质,如果flapMap 如果包了两层,会去掉一层
Function composition 组合函数,最后得到一个函数。
Compose andthen
Andthen 先运行自己
Compose 先运行别人
Compose 可以动态处理,如果option.的话就写死了。
7、Curry(柯里化)
每传1个参数就返回一个函数,直到参数全部传完。
8、Stream.collect
• Collectors 类
• ToMap
• Join
• groupingBy
Stream.collect() 是java 8 stream api中的终止方法。
Joining 比较方便,不用循环再链接了。
public class Main { public static void main(String[] args) { List<String> list = Arrays.asList("springboot教程","springcloud教程","java教程","架构教程"); String result2 = list.stream().collect(Collectors.joining("||")); // 打印 springboot教程||springcloud教程||java教程||架构教程 System.out.println(result2); } }
Goupby 可以分层进行排序
8、IntStream.rangeClosed()
boxed装箱一下,变为stream