zoukankan      html  css  js  c++  java
  • java8新特性学习笔记(二) 流的相关思想

     流是什么

    流是Java API的新成员,他允许你以声明的方式处理数据集合,就现在来说,可以把他们看成遍历数据集合的高级迭代器.此外,流还可以透明地并行处理,你无须写任何多线程代码.

    下面例子是新老API的对比:

            List<Dish> menu = new ArrayList<>();
            List<Dish> lowCaloricDishes = new ArrayList<>();
            for (Dish d : menu) {
                if (d.getCalories() < 400) {
                    lowCaloricDishes.add(d);
                }
            }
            Collections.sort(lowCaloricDishes, new Comparator<Dish>() {
                @Override
                public int compare(Dish o1, Dish o2) {
                    return Integer.compare(o1.getCalories(), o2.getCalories());
                }
            });
    
            List<String> lowCaloricDishName = new ArrayList<>();
            for (Dish d : lowCaloricDishes) {
                lowCaloricDishName.add(d.getName());
            }

    上面这段代码 用了一个"垃圾变量" lowCaloricDishes.他唯一的用途就是做一次中间容器,在Java8中 实现的细节被放在它本该归属的库里了.

           List<String> lowCaloricDishName = menu.stream()
                    .filter(d -> d.getCalories() < 400)
                    .sorted(Comparator.comparing(Dish::getCalories))
                    .map(Dish::getName)
                    .collect(Collectors.toList());
            //为了利用多核架构并行执行这段代码,你只需要把stream()换成parallelStream():
            List<String> lowCaloricDishName = menu.parallelStream()
                    .filter(d -> d.getCalories() < 400)
                    .sorted(Comparator.comparing(Dish::getCalories))
                    .map(Dish::getName)
                    .collect(Collectors.toList());

     流和集合

      集合和流的差异就在于什么时候进行计算,集合是一个内存中的数据接口,他包含数据接口中目前所有的值,集合中的每个元素都要先计算出来才能添加到集合中,相比之下流是概念上的固定数据结构,其元素则是按需计算的,这个思想就是用户仅仅从流中提取需要的值,而这些值在用户看不到的地方 按需生成.这是一种生产者消费者的关系,也可以说流是一个延迟创建的集合,只有在消费者要求的时候才会计算值,相反集合是急切创建的.

    内部迭代和外部迭代

      使用Collection接口需要用户去做迭代,这称为外部迭代,相反,Streams库使用内部迭代, 他帮你把迭代做了 还把得到的流值存在了某个地方,你只要给出一个函数要干什么就可以了

    下面代码说明了这种区别.

          List<String> names = new ArrayList<>();
    
            for (Dish d : menu) {//显示的顺序迭代菜单列表
                names.add(d.getName());//提取名称并将其添加到累加器
            }
    
            names = menu.stream()
                    .map(Dish::getName)//用getName方法参数化map 提取菜名
                    .collect(Collectors.toList());//开始执行操作流水线;没有迭代

    其实说的白话一点,就是外部迭代就是显示的迭代, 而内部迭代就是告诉流,要怎么迭代流或者说如何计算值.

    流操作

      java.util.stream.stream中的Stream接口定义了需要操作,他们可以分为两大类

              List<String> names = menu.parallelStream()//从菜单中提取流
                    .filter(d -> d.getCalories() < 400)//筛选  中间操作
                    .map(Dish::getName)//中间操作
                    .limit(3)//中间操作
                    .collect(Collectors.toList());//将Stream转化为List
    • filter,map,limit可以连成一条流水线
    • collect触发流水线执行并关闭它

    可以连接起来的流操作为中间操作,关闭流的操作称为终端操作

    中间操作

      中间操作会返回另一个流,这让多个操作可以连接起来形成一个查询,

    终端操作

      终端操作会从流的流水线生产结果,比如list Integer甚至是void.

  • 相关阅读:
    【CAS单点登录视频教程】 第03集 -- 配置 tomcat的 ssl
    【CAS单点登录视频教程】 第02集 -- 安装CAS
    【CAS单点登录视频教程】 第01集-- 认识CAS
    Easyui入门视频教程 第11集---Window的使用
    Easyui入门视频教程 第10集---Messager的使用
    Easyui入门视频教程 第09集---登录完善 图标自定义
    Easyui入门视频教程 第08集---登录实现 ajax button的使用
    Easyui入门视频教程 第07集---Accordion的使用
    Easyui入门视频教程 第06集---Layout初始化和属性方法使用
    Easyui入门视频教程 第05集---Easyui复杂布局
  • 原文地址:https://www.cnblogs.com/ten951/p/6071039.html
Copyright © 2011-2022 走看看