Stream API相关内容

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

先说说我自己的感受:Stream API其实也是语法糖,它简化了Java语言中对集合数据进行操作的复杂度。我自己对于这个JDK1.8的新的API只是要求能看懂就行了,别到时候看到相关代码一脸懵逼就行。。。要我经常写应该不太可能。。。

Stream 是 Java8 中处理集合的关键抽象概念,它可以指定你希望对集合进 行的操作,可以执行非常复杂的查找、过滤和映射数据等操作。 使用 Stream API 对集合数据进行操作,就类似于使用 SQL 执行的数据库查询。 也可以使用 Stream API 来并行执行操作。简言之,Stream API 提供了一种高效且易于使用的处理数据的方式。

 为什么要使用Stream API

  • 实际开发中,项目中多数数据源都来自于Mysql,Oracle等。但现在数 据源可以更多了,有MongDB,Radis等,而这些NoSQL的数据就需要 Java层面去处理。
  • Stream 和 Collection 集合的区别:Collection 是一种静态的内存数据 结构,而 Stream 是有关计算的。前者是主要面向内存,存储在内存中, 后者主要是面向 CPU,通过 CPU 实现计算

 Stream是数据渠道,用于操作数据源(集合、数组等)所生成的元素序列。 Stream 自己不会存储元素。Stream 不会改变源对象。相反,他们会返回一个持有结果的新Stream。Stream 操作是延迟执行的。这意味着他们会等到需要结果的时候才执行。

Stream 的操作三个步骤

1- 创建 Stream:一个数据源(如:集合、数组),获取一个流   

2- 中间操作:一个中间操作链,对数据源的数据进行处理 

3- 终止操作(终端操作):一旦执行终止操作,就执行中间操作链,并产生结果。之后,不会再被使用。

创建 Stream方式 

  • 通过集合:Java8 中的 Collection 接口被扩展,提供了两个获取流 的方法:  default Stream<E> stream() : 返回一个顺序流 ,default Stream<E> parallelStream() : 返回一个并行流。
  • 通过数组:Java8 中的 Arrays 的静态方法 stream() 可以获取数组流:static <T> Stream<T> stream(T[] array): 返回一个流
  • 通过Stream的of():可以调用Stream类静态方法 of(), 通过显示值创建一个 流。它可以接收任意数量的参数。 public static<T> Stream<T> of(T... values) : 返回一个流。
  • 创建无限流:可以使用静态方法 Stream.iterate() 和 Stream.generate(), 创建无限流。

Stream 的中间操作

多个中间操作可以连接起来形成一个流水线,除非流水线上触发终止 操作,否则中间操作不会执行任何的处理!而在终止操作时一次性全 部处理,称为“惰性求值”。
 

 

Stream 的终止操作 

  • 终端操作会从流的流水线生成结果。其结果可以是任何不是流的值,例 如:List、Integer,甚至是 void 。  
  • 流进行了终止操作后,不能再次使用。
     

 

 

 使用例子:

//筛选与切片 
public void test1(){
        List<Employee> list = EmployeeData.getEmployees();
//        filter(Predicate p)——接收 Lambda , 从流中排除某些元素。
        Stream<Employee> stream = list.stream();
        //练习:查询员工表中薪资大于7000的员工信息
        stream.filter(e -> e.getSalary() > 7000).forEach(System.out::println);

        System.out.println();
//        limit(n)——截断流,使其元素不超过给定数量。
        list.stream().limit(3).forEach(System.out::println);
        System.out.println();

//        skip(n) —— 跳过元素,返回一个扔掉了前 n 个元素的流。若流中元素不足 n 个,则返回一个空流。与 limit(n) 互补
        list.stream().skip(3).forEach(System.out::println);

        System.out.println();
//        distinct()——筛选,通过流所生成元素的 hashCode() 和 equals() 去除重复元素

        list.add(new Employee(1010,"XXX",40,8000));
        list.add(new Employee(1010,"XXX",41,8000));
        list.add(new Employee(1010,"XXX",40,8000));
        list.add(new Employee(1010,"XXX",40,8000));
        list.add(new Employee(1010,"XXX",40,8000));

//        System.out.println(list);

        list.stream().distinct().forEach(System.out::println);
    }

 

 

 

 









 



 

 

 

 


 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章