Java8-Stream集合处理详解

本文详细介绍了Java8中的Stream特性,包括Stream的介绍、特点、使用流程及如何获取Stream接口对象。Stream提供了内部迭代的方式,支持延迟执行和聚合操作,使代码更加简洁高效。文章对比了传统循环遍历与Stream操作的区别,并举例说明了Stream的使用方法,如filter、map、reduce等。
摘要由CSDN通过智能技术生成

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
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);
                  }
              }
          
  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值