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

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

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<String> 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<String> 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

目录
相关文章
|
7天前
|
安全 Java 大数据
|
8天前
|
安全 Java 大数据
探索Java的奇妙世界:语言特性与实际应用
探索Java的奇妙世界:语言特性与实际应用
|
7天前
|
Java Unix Windows
|
1天前
|
分布式计算 Java API
Java 8新特性之Lambda表达式与Stream API
【5月更文挑战第1天】本文将介绍Java 8中的两个重要特性:Lambda表达式和Stream API。Lambda表达式是一种新的函数式编程语法,可以简化代码并提高可读性。Stream API是一种用于处理集合的新工具,可以方便地进行数据操作和转换。通过结合Lambda表达式和Stream API,我们可以更加简洁高效地编写Java代码。
|
2天前
|
供应链 Java API
Java 8新特性解析及应用区块链技术在供应链管理中的应用与挑战
【4月更文挑战第30天】本文将深入探讨Java 8的新特性,包括Lambda表达式、Stream API和Optional类等。通过对这些新特性的详细解析和应用实例,帮助读者更好地理解和掌握Java 8的新技术。
|
2天前
|
Java
Java8 Stream Collectors groupingBy使用
Java8 Stream Collectors groupingBy使用
|
3天前
|
安全 Java API
Java 8新特性概述及其对编程实践的影响
【4月更文挑战第30天】本文将详细讨论Java 8的新特性,包括Lambda表达式、Stream API以及Optional类等,并探讨这些新特性如何改变了Java编程的实践。我们将通过实例代码展示这些新特性的用法,并分析其对提高代码可读性和编写效率的影响。
|
3天前
|
安全 Java API
Java 8新特性深度解析
【4月更文挑战第30天】本文将深入探讨Java 8的新特性,包括Lambda表达式、Stream API、Optional类等,以及这些新特性如何改变我们编写Java代码的方式。
|
3天前
|
分布式计算 Java 大数据
【Java探索之旅】我与Java的初相识(一):Java的特性与优点及其发展史
【Java探索之旅】我与Java的初相识(一):Java的特性与优点及其发展史
12 0
|
3天前
|
Java API
Java 8新特性之Lambda表达式详解
【4月更文挑战第29天】本文将深入探讨Java 8中引入的Lambda表达式,这是Java历史上的一次重大变革。我们将详细解析Lambda表达式的基本概念,语法结构,以及如何在实际编程中应用。此外,我们还将探讨Lambda表达式与函数式接口的关系,以及它如何改变我们编写和理解Java代码的方式。