您当前的位置: 首页 >  Java

杨林伟

暂无认证

  • 2浏览

    0关注

    3337博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

Java8 stream流特性总结(超详细)

杨林伟 发布时间:2020-12-02 15:40:15 ,浏览量:2

文章目录
    • 1. 什么是Stream
    • 2. Stream常用案例
      • 2.1 串行流和并行流
        • 2.1.1 串行流
        • 2.1.3 并行流
      • 2.2 聚合操作
        • 2.2.1 filter 过滤
        • 2.2.2 map 抽取内容生成集合
        • 2.2.3 sorted 排序
        • 2.2.4 limit 限制查询条目数
        • 2.2.5 distinct 去重
        • 2.2.6 skip 跳过元素
        • 2.2.7 mapTo 统计
        • 2.2.8 collect 规约操作
    • 3. 结语

1. 什么是Stream

本文的代码已上传到Github,有兴趣的小伙伴可以下载看看:https://github.com/ylw-github/Java8-New-Feature

下面直观点了解Stream:

  • Stream是Java8 新增的流特性,目的是让程序员写出高效率、干净、简洁的代码
  • Stream类似于SQL语句,可以对代码进行集合运算和表达
  • Stream就是把元素看成一种流,流在管道中传输, 并且可以在管道的节点上进行处理, 比如筛选, 排序,聚合等。

我把Stream使用格式整理成如下图: 在这里插入图片描述 图中的三个角色解释如下:

  • 数据源: 可以是集合、数组、I/O channel、 生成器generator 等。
  • 流:分为串行流stream() 和 并行流parallelStream()
  • 聚合操作:类似SQL一样, 常见的有 filter , map , reduce , find , match , sorted等。
2. Stream常用案例

首先先初始化一些数据:

// 表达式:
personList.add(new Person(String name, Integer age, Integer sex));

// 初始化数据
personList.add(new Person("张三", 18, 1));
personList.add(new Person("李四", 20, 2));
personList.add(new Person("王五", 16, 2));
personList.add(new Person("赵六", 32, 1));
personList.add(new Person("陆七", 19, 1));
2.1 串行流和并行流 2.1.1 串行流

直接贴代码:

private static void testStream() {
      long startTime = System.currentTimeMillis();
      personList.stream().forEach(person -> {
          System.out.println(person.toString());
      });
      System.out.println("stream consume time -> " + (System.currentTimeMillis() - startTime));
  }

运行结果: 在这里插入图片描述 结论:可以看到耗时两毫秒,内容按顺序输出。

2.1.3 并行流

直接贴代码:

private static void testParallelStream() {
      long startTime = System.currentTimeMillis();
      personList.parallelStream().forEach(person -> {
          System.out.println(person.toString());
      });
      System.out.println("parallelStream consume time -> " + (System.currentTimeMillis() - startTime));
  }

运行结果: 在这里插入图片描述 结论:可以看到耗时19毫秒,内容无序输出,比串行流慢。

2.2 聚合操作 2.2.1 filter 过滤

过滤所有性别男生的人,代码如下:

private static void testFilter() {
    personList.stream().filter(person -> person.getSex() == 1).forEach(person -> {
        System.out.println("男生 ->" + person.toString());
    });
}

运行结果: 在这里插入图片描述

2.2.2 map 抽取内容生成集合

取出对象集合中的姓名,并生成List集合,代码如下:

private static void testMap() {
    List nameList = personList.stream().map(Person::getName).collect(Collectors.toList());
    nameList.forEach(name ->{
        System.out.println(name);
    });
}

运行结果: 在这里插入图片描述

2.2.3 sorted 排序

按年龄进行排序,代码如下:

private static void testSorted() {
   
   System.out.println("------ 按年龄升序排序 ------");
   personList.stream().sorted(Comparator.comparing(Person::getAge)).forEach(person -> {
       System.out.println(person.toString());
   });
   
   System.out.println("------ 按年龄降序排序 ------");
   personList.stream().sorted(Comparator.comparing(Person::getAge).reversed()).forEach(person -> {
       System.out.println(person.toString());
   });
}

运行结果: 在这里插入图片描述

2.2.4 limit 限制查询条目数

查询两位人员数据,代码如下:

private static void testLimit() {
    personList.stream().limit(2).forEach(person -> {
        System.out.println(person.toString());
    });
}

运行结果: 在这里插入图片描述

2.2.5 distinct 去重

代码如下:

private static void testDistinct() {
    int[] ints = {1, 1, 2, 2, 3, 3, 3, 4, 4, 4, 4};
    Arrays.stream(ints).distinct().forEach(number -> {
        System.out.println("number ->" + number);
    });
}

运行结果: 在这里插入图片描述

2.2.6 skip 跳过元素

跳过前面4个人,代码如下:

private static  void testSkip(){
   personList.stream().skip(4).forEach(person -> {
       System.out.println(person.toString());
   });
}

运行结果: 在这里插入图片描述

2.2.7 mapTo 统计

统计人员的年龄情况,代码如下:

private static void testMapTo() {
    IntSummaryStatistics intSummaryStatistics = personList.stream().mapToInt(Person::getAge).summaryStatistics();
    System.out.println("总条目数 ——> "+intSummaryStatistics.getCount());
    System.out.println("总年龄 ——>"+intSummaryStatistics.getSum());
    System.out.println("最大年龄 ——>"+intSummaryStatistics.getMax());
    System.out.println("最小年龄 ——>"+intSummaryStatistics.getMin());
    System.out.println("平均年龄 ——>"+intSummaryStatistics.getAverage());
}

运行结果: 在这里插入图片描述

2.2.8 collect 规约操作

抽出人员名字,并以逗号分隔,代码如下:

private static void testCollect() {
    List nameList = personList.stream().map(Person::getName).collect(Collectors.toList());
    String names = nameList.stream().collect(Collectors.joining(","));
    System.out.println("names ->" + names);
}

运行结果: 在这里插入图片描述

3. 结语

stream除了本文写的,还有很多的操作,在此不再赘述,有兴趣的童鞋可以去参考官方的API:https://www.oracle.com/java/technologies/javase/8-whats-new.html

关注
打赏
1662376985
查看更多评论
立即登录/注册

微信扫码登录

0.2803s