展开
拓展 关闭
订阅号推广码
GitHub
视频
公告栏 关闭

集合框架

  • 并⾏流parallelStream
集合做重复的操作,如果使⽤串⾏执⾏会相当耗时,因此⼀般会采⽤多线程来加快, Java8的paralleStream⽤fork/join框架提供了并发执⾏能⼒
底层原理
    线程池(ForkJoinPool)维护⼀个线程队列
    可以分割任务,将⽗任务拆分成⼦任务,完全贴合分治思想
  • 串行与并行的区别
public class Main {

    public static void main(String[] args) throws Exception {
       // 串行与并行的区别
       List<Integer> numbers = Arrays.asList(1,2,3,4,5,6,7,8,9);
       numbers.stream().forEach(System.out::println);       // 串行
       numbers.parallelStream().forEach(System.out::println);   // 并行,不会顺序执行
    }

}
  • paralleStream并⾏是否⼀定⽐Stream串⾏快?
错误,数据量少的情况,可能串⾏更快,ForkJoin会耗性能
  • 多数情况下并⾏⽐串⾏快,是否可以都⽤并⾏
不⾏,部分情况会有线程安全问题,parallelStream⾥⾯使⽤的外部变量,⽐如集合⼀定要使⽤线程安全集合,不然就会引发多线程安全问题
  • 案例
public class Main {

    public static void main(String[] args) throws Exception {
        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());
        }
    }

}
  • reduce操作
public class Main {

    public static void main(String[] args) throws Exception {
        // Stream.of()方法创建stream流;返回相加的值
        int value = Stream.of(1, 2, 3, 4, 5).reduce((item1, item2) -> item1 + item2).get();
        System.out.println(value);

        // 返回相加的值,不适用lambda表达式的写法
        int value =  Stream.of(1, 2, 3, 4, 5).reduce(new BinaryOperator<Integer>() {
            @Override
            public Integer apply(Integer integer, Integer integer2) {
                return integer+integer2;
            }
        }).get();
        System.out.println(value);

        // 返回相加的值,方式2
        int value = Stream.of(1, 2, 3, 4, 5).reduce(100,(item1,item2)->item1+item2);
        System.out.println(value);

        // 返回最大值
        int value = Stream.of(1645, 234345, 32, 44434, 564534, 435, 34343542, 212)
                .reduce((item1, item2) -> item1 > item2 ? item1 : item2).get();
        System.out.println(value);
    }

}
  • foreach使用
public class Main {

    public static void main(String[] args) throws Exception {
        // forEach使用
        List<String> list = Arrays.asList("sdfsdf","xxxx","bbb");
        // 写法1
        list.forEach(obj->System.out.println(obj));
        // 写法2
        list.forEach(System.out::println);
    });
    
}
posted @ 2022-08-24 16:20  DogLeftover  阅读(46)  评论(0编辑  收藏  举报