1.default关键字
允许在接口中声明default实现方法,这是jdk版本迭代过程中需要对之前的接口做扩展,不得不引入的语法糖
2.Stream
Stream流使用的好处是,做集合运算,内部使用并发线程,然后再合并结果,目的是提供集合运算效率。
多线程之间数据合并,又依赖于管道机制,管道机制是多线程或者多进程通信的基本方式
3.使用相关:
stream 串行流只是对源数据的迭代器迭代一遍,应用代码中写的算子(多个算子会嵌套调用)。parallelStream 依赖源数据迭代器的切分方式,将源数据尽量均匀地切分成多份,然后基于 forkjoin 框架来并行处理。并行流的成本还是有点高的,所以对于小数据量不要随便使用。
https://www.v2ex.com/amp/t/573833
Java API 1.8 中文 在线帮助文档
https://www.jianshu.com/p/ded59f0231f2
相关并发线程流的性能方面的注意:
https://blog.csdn.net/qq_20989105/article/details/81234175
Java 8 (6) Stream 流 - 并行数据处理与性能
https://www.cnblogs.com/baidawei/p/9370048.html
用传统for循环的方式是最快的,因为它更为底层,更重要的是不需要对原始类型进行任何装箱或拆箱操作。他才5毫秒即可完成。
顺序化执行结果为105毫秒,
用并行化进行测试,结果居然是最慢的 147毫秒,因为iterate生成的是装箱的对象,必须拆箱成数字才能求和,并且我们很难把iterate分成多个独立块来进行并行执行。
这意味着 并行化编程可能很复杂,如果用的不对,它甚至会让程序的整体性能更差。
LongStream.rangeClosed方法与iterate相比有两个优点:
1.LongStream.rangeClosed直接产生原始类型的long数字,没有装箱和拆箱。
2.LongStream.rangeClosed会生成数字范围,很容易拆分为独立的小块。
//5publicstaticlongGetRangeClosedSum(long n){
returnLongStream.rangeClosed(1,n).reduce(0L,Long::sum);
}
顺序化的LongStream.rangeClosed 只花费了5毫秒,他比iterate顺序化要快得多,因为他没有装箱和拆箱。再来看看并行化:
//1publicstaticlongGetRangeClosedSumParallel(long n){
returnLongStream.rangeClosed(1,n).parallel().reduce(0L,Long::sum);
}
LongStream.rangeClosed 调用parallel方法后,执行只使用了1毫秒,终于可以像上面图中一样并行了,并行化过程本身需要对流做递归划分,把每个子流的归纳操作分配到不同的线程,然后把这些操作的结果合并成一个值。
java8新特性(六):Stream多线程并行数据处理
https://blog.csdn.net/sunjin9418/article/details/53143588/
Stream并行流性能测试
https://blog.csdn.net/qq_33745102/article/details/84076729
Stream并发问题parallel简单展示