愿景:"让编程不再难学,让技术与生活更加有趣"
更多架构课程请访问 xdclass.net
目录
第1集 Java新特性玩转JDK8之并行流parallelStream
第1集 Java新特性玩转JDK8之并行流parallelStream
简介:讲解jdk8里面的并行流parallelStream
-
为什么会有这个并行流
-
集合做重复的操作,如果使用串行执行会相当耗时,因此一般会采用多线程来加快, Java8的paralleStream用fork/join框架提供了并发执行能力
-
底层原理
-
线程池(ForkJoinPool)维护一个线程队列
-
可以分割任务,将父任务拆分成子任务,完全贴合分治思想
-
-
-
两个区别
//顺序输出 List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9); numbers.stream().forEach(System.out::println); //并行乱序输出 List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9); numbers.parallelStream().forEach(System.out::println);
-
问题
-
paralleStream并行是否一定比Stream串行快?
-
错误,数据量少的情况,可能串行更快,ForkJoin会耗性能
-
-
多数情况下并行比串行快,是否可以都用并行
-
不行,部分情况会有线程安全问题,parallelStream里面使用的外部变量,比如集合一定要使用线程安全集合,不然就会引发多线程安全问题
-
-
for(int i=0;i<10;i++) {
List list = new ArrayList();
//List list = new CopyOnWriteArrayList();
IntStream.range(0, 100).parallel().forEach(list::add);
System.out.println(list.size());
}
第2集 Java新特性玩转JDK8之reduce操作
简介:讲解jdk8里面的reduce操作
-
什么是reduce操作
-
聚合操作,中文意思是 “减少”
-
根据一定的规则将Stream中的元素进行计算后返回一个唯一的值
-
常用方法一
Optional<T> reduce(BinaryOperator<T> accumulator);
-
accumulator 计算的累加器
-
例子: 第一个元素相加和第二个元素相加,结果再和第三个元素相加,直到全部相加完成
int value = Stream.of(1, 2, 3, 4, 5).reduce((item1, item2) -> item1 + item2).get();
-
不用lambda的写法
int result = Stream.of(1,2,3,4,5).reduce(new BinaryOperator<Integer>() { @Override public Integer apply(Integer item1, Integer item2) { return item1 + item2; } }).get();
-
-
常用方法二
T reduce(T identity, BinaryOperator<T> accumulator);
-
identity 用户提供一个循环计算的初始值
-
accumulator 计算的累加器
-
例子: 100作为初始值,然后和第一个元素相加,结果在和第二个元素相加,直到全部相加完成
int value = Stream.of(1, 2, 3, 4,5).reduce(100, (sum, item) -> sum + item);
-
-
练习 : 求最大值
int value = Stream.of(1645, 234345, 32, 44434,564534,435,34343542,212).reduce( (item1, item2) -> item1 > item2 ? item1 : item2 ).get(); System.out.println(value);
-
第3集 Java新特性玩转JDK8之集合的foreach
简介:讲解jdk8里面的list的foreach操作
-
集合遍历的方式
-
for循环
-
迭代器 Iterator
-
-
Jdk8里面的新增接口
default void forEach(Consumer<? super T> action) { Objects.requireNonNull(action); for (T t : this) { action.accept(t); } } List<Student> results = Arrays.asList(new Student(32),new Student(33),new Student(21),new Student(29),new Student(18)); results.forEach(obj->{ System.out.println(obj.toString()); });
-
注意点
-
不能修改包含外部的变量的值
-
不能用break或者return或者continue等关键词结束或者跳过循环
-
干货文档
关注公众号发送:“CSDN干货文档” 即可领取