四、建立Stream流

一、前言

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

StreamJava8中处理集合的关键抽象概念,他能够指定你但愿对集合进行的操做,能够执行很是复杂的查找,过滤,和映射数据等操做。数据库

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

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

二、基本概念

a sequence of elements supporting sequential and parallel aggregate operations.

Stream是元素的集合(这点让stream看起来相似iterator),能够支持顺序和并行 的对原stream进行汇聚操做ide

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

你们看完这些可能对Stream尚未一个直观的认识,莫急,我们来段代码。code

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的人的个数对象

注意点blog

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

三、基本语法

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

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

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

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

3.一、建立Stream流

建立Stream存在两种途径

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

使用Strean静态方法建立Stream

一、经过 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);

二、经过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);
    }
相关文章
相关标签/搜索