• 4、创建Stream流


    1、前言

    Java8 中有两个最为重要的改变。
    第一就是Lambda表达式;另外一个就是Stream API

    StreamJava8中处理集合的关键抽象概念,他可以指定你希望对集合进行的操作,可以执行非常复杂的查找,过滤,和映射数据等操作。

    使用Stream API对集合数据进行操作,就类似使用SQL执行的数据库查询。也可以使用Stream API进行并行执行操作。

    简而言之,StreamAPI提供了一种高效且易于使用的处理数据的方式。

    2、基本概念

    a sequence of elements supporting sequential and parallel aggregate operations.
    

    Stream是元素的集合(这点让stream看起来类似iterator),可以支持顺序和并行 的对原stream进行汇聚操作

    • 说白了,流是数据渠道,用于操作数据源(集合、数组等)所生成的元素序列,集合讲的是数据,流讲的是计算
    • 大家可以把Stream当成一个高级版本的Iterator。原始版本的Iterator,用户只能一个一个的遍历元素并对其执行某些操作;高级版本的Stream,用户只要给出需要对其包含的元素执行什么操作,比如“过滤掉长度大于10的字符串”、“获取每个字符串的首字母”等,具体这些操作如何应用到每个元素上,就给Stream就好了!

    大家看完这些可能对Stream还没有一个直观的认识,莫急,咱们来段代码。

            List<Person> pList = new ArrayList<>();
            Person p1 = new Person("tom", "23", "175", "36512@qq.com");
            Person p2 = new Person("jack", "34", "185", "888@qq.com");
            Person p3 = new Person("rose", "14", "176", "9566@qq.com");
    
            pList.add(p1);
            pList.add(p2);
            pList.add(p3);
    
           int count = (int) pList.stream().filter(x -> x.getAge().equals("23")).count();
            System.out.println("count:" + count);
    

    上面这段代码获取的是年纪为23的人的个数

    注意点

    1. Stream不会自己存储元素
    2. Stream不会改变源对象。相反,他们会返回一个持有结果的新Stream
    3. Stream操作是延迟执行的。这意味着他们会等到需要结果的时候才执行

    3、基本语法

    上图就是对于Stream例子的一个解析,可以很清楚的看见:原本一条语句被三种颜色的框分割成了三个部分

    • 红色框中的语句是一个Stream的生命开始的地方,负责创建一个Stream实例

    • 绿色框中的语句是赋予Stream灵魂的地方,把一个Stream转换成另外一个Stream,红框的语句生成的是一个包含所有nums变量的Stream,进过绿框的filter方法以后,重新生成了一个过滤掉原nums列表所有null以后的Stream

    • 蓝色框中的语句是丰收的地方,把Stream的里面包含的内容按照某种算法来汇聚成一个值,例子中是获取Stream中包含的元素个数。

    3.1、创建Stream流

    创建Stream存在两种途径

    • 通过Stream静态工厂方法
    • 通过Collection接口的默认方法--stream(),把一个Collection对象转成Stream

    使用Strean静态方法创建Stream

    1、通过 of(T...)方法

            List<Student> studentList = new ArrayList<>();
            studentList.add(new Student(1,"赵迪",23));
            studentList.add(new Student(2,"tom",25));
            studentList.add(new Student(2,"jack",27));
            studentList.add(new Student(2,"rose",22));
    
            Stream stream = Stream.of(studentList);
    

    2、通过generator()方法

    generator方法可以生成一个无限长度的Stream,其元素的生成是通过给定的Supplier(这个接口可以看成一个对象的工厂,每次调用返回一个给定类型的对象)

    Stream.generate(new Supplier<Double>() {
    
        @Override
        public Double get() {
            return Math.random();
        }
    });
    
    Stream.generate(() -> Math.random());
    
    Stream.generate(Math::random);
    

    三条语句的作用都是一样的,只是使用了lambda表达式和方法引用的语法来简化代码。

    每条语句其实都是生成一个无限长度的Stream,其中值是随机的。

    这个无限长度Stream是懒加载,一般这种无限长度的Stream都会配合Streamlimit()方法来用。

    通过Collection子类获取Stream

    如下的代码是collection源码中的默认方法,所以说可以直接在子类中获取stream

     default Stream<E> stream() {
            return StreamSupport.stream(spliterator(), false);
        }
    
    一个小小的程序员
  • 相关阅读:
    字典序问题 算法实现题1-2
    统计数字问题 算法实现1-1
    P问题 NP问题 NPC问题 NP-Hard问题 简述
    Python argparse库简单入门
    HDU 3506 区间DP 四边形不等式
    HDU 1530 最大团问题 模板
    树状数组入门+代码
    HDU 1520 Anniversary party 树状dp
    京东 广告部门一面 4.22
    字节跳动 ailab二面 4.16
  • 原文地址:https://www.cnblogs.com/zhaod/p/13437149.html
Copyright © 2020-2023  润新知