并行流、串行流
前面提到过,JDK1.8提供了StreamAPI,而Stream又分为两种
- 并行流
- 顺序流
并行流
并行流其实就是把一个内容分成多个数据块,并使用不同的线程分别处理每个数据块的流
Fork/Join框架
并行流底层的实现就是Fork/Join框架
这个框架的本质原理就是将任务不断拆分成小任务(拆到不能再拆),将每个小任务交给多线程去执行,最后进行归并,小任务完成的结果进行合并成大任务的结果
多线程的好处就是可以尽量避免由于阻塞带来的性能浪费,而且还有一个任务偷窃的效果,CPU将任务放入线程里面的任务队列中,而任务队列是一个双端队列,假如A线程任务队列满了,而B线程的任务队列为空,就会从A线程的任务队列中的尾端去拿任务执行
使用并行流其实就是调用StreamAPI的parallel方法
串行流
默认的Stream就是串行流,但其是一个单线程的执行任务
Optional容器
为了尽量避免空指针异常,Java8提供了Optional容器,是一个容器类来的(封装了对象),用来代表这个值存在还是不存在,原来使用Null来表示一个值不存在,现在使用Optional可以更好的去表达值是否存在了,并且可以有效地避免空指针异常,从使用空对象会报空指针异常,到去获取对象就报空指针!!!本质就是延迟了空指针的报出
Optional常用方法
- 可以使用of静态方法可以构建对象,但注意,这个方法接受的容器对象不能为Null,似乎看起来违背了Optional的作用(避免空指针异常),但其实这是在创建Optional容器使用的对象就为空,不是使用时报空指针
- ofEmprt:可以构建一个空Optional容器,调用get方法会报空指针
- ofNullable:若给的对象不为null,创建Optional容器,否则就创建空实例,调用get方法也会报空指针
- isPresent:如果Optional容器有值就返回,没值就什么都不做(不报空指针),返回一个空白(避免空指针异常)
- orElse:如果容器有值就返回原有值,没有就返回传入的参数(避免空指针异常)
- orElseGet:传一个Supplier函数式接口(供给型接口),如果容器有值返回原有值,如果没值返回供给型接口的返回值(避免空指针)
- map:如果有值可以对函数进行处理,就返回处理后的Optional,如果没有就返回空Optional(避免空指针)
- flatMap:有map相似,但返回处理后的Optional必须与原Optional一样,不能是另外的Optional
建议,将可能为Null的对象,改用Optional来进行封装!