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);
}