小滴课堂-学习笔记:(6)Java高级核心之玩转 JDK8 集合框架进阶

56 篇文章 0 订阅
20 篇文章 0 订阅

logo 愿景:"让编程不再难学,让技术与生活更加有趣"


更多架构课程请访问 xdclass.net

 

目录

第1集 Java新特性玩转JDK8之并行流parallelStream

第2集 Java新特性玩转JDK8之reduce操作

第3集 Java新特性玩转JDK8之集合的foreach

干货文档


第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干货文档”  即可领取

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

dev666

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值