Java8-Stream
文章目录
1. Stream
1.1 Stream介绍
1.1.1 介绍
-
Java 8 API添加了一个新的抽象称为流 Stream,可以让你以一种声明的方式处理数据。
Stream 使用一种类似用 SQL 语句从数据库查询数据的直观方式来提供一种对 Java 集合运算和表达的高阶抽象。
-
Stream API可以极大提高Java程序员的生产力,让程序员写出高效率、干净、简洁的代码。
这种风格将要处理的元素集合看作一种流, 流在管道中传输, 并且可以在管道的节点上进行处理, 比如筛选, 排序,聚合等。
-
元素流在管道中经过中间操作(intermediate operation)的处理,最后由最终操作(terminal operation)得到前面处理的结果
![1460000018919149](https://i-blog.csdnimg.cn/blog_migrate/3dd132ff9a524fb5c83a2e2c294628ad.png)
1.1.2 Stream特点
(1)数据源
- 数据源可以是集合,数组,I/O channel,产生器generator等(Stream本身并不保存数据)
(2)支持聚合操作
- 聚合操作:类似SQL语句一样的操作, 比如filter, map, reduce, find, match, sorted等
(3)Pipelining
- 中间操作都会返回流对象stream本身。 这样多个操作可以串联成一个管道, 如同流式风格(fluent style)。 这样做可以对操作进行优化, 比如延迟执行(laziness)和短路( short-circuiting)
(4)内部迭代
- 以前对集合遍历都是通过Iterator或者For-Each的方式, 显式的在集合外部进行迭代, 这叫做外部迭代。 Stream提供了内部迭代的方式, 通过访问者模式(Visitor)实现
(5)延迟执行
- 中间的操作只是提供了一个操作逻辑,并记录,只有最终求值时才会执行传入的操作
1.1.3 直接对集合遍历操作与使用Stream操作集合的对比
(1)使用循环遍历
-
如果是处理简单数据,进行简单操作,使用循环遍历集合,并没有什么不妥,但是如果是复杂的大型的数据使用循环不仅会使处理效率变得底下,而且会降低代码的可读性
-
例如下面代码:查找符合条件的学生
- 以下是通过遍历集合,通过条件判断来对符合条件的数据进行操作
class Student implements Comparable<Student> { int id; String name; String className; int grade; public Student(int id, String name, String className, int grade) { ...} @Override public String toString() { ...} //使用成绩决定排名 @Override public int compareTo(Student o) { return this.grade-o.grade; } } public class StreamTest { public static void main(String[] args) { LinkedList<Student> studentList = new LinkedList<Student>(); studentList.add(new Student(1, "Alice", "1班", 100)); studentList.add(new Student(2, "Bob", "2班", 85)); studentList.add(new Student(3, "Coco", "2班", 46)); studentList.add(new Student(4, "Dav", "3班", 95)); studentList.add(new Student(5, "Elizabeth", "4班", 81)); studentList.add(new Student(6, "Fermat", "4班", 69)); studentList.add(new Student(7, "grace", "4班", 59)); //选取4班,成绩大于60的人,和其他班成绩大于50的人 //由于是链表,为了性能,这里使用iterator进行迭代 Iterator<Student> iter = studentList.listIterator(); while(iter.hasNext()){ Student cur = iter.next(); if("4班".equals(cur.className)){ if(cur.grade>60) { System.out.println(cur); } } else if(cur.grade>50){ System.out.println(cur); } }
-