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不需要返回值,也可以调用有返回值的方法

参数是严格要求的

4streamlist的区别

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模式

5CompletableFuture

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

1CompletableFufure.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个参数就返回一个函数,直到参数全部传完。

 

8Stream.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

 

 

posted @ 2021-03-01 11:29  majingyun  阅读(113)  评论(0编辑  收藏  举报