Stream API:高效处理数据流!

举报
喵手 发表于 2025/06/09 16:23:50 2025/06/09
【摘要】 开篇语哈喽,各位小伙伴们,你们好呀,我是喵手。运营社区:C站/掘金/腾讯云/阿里云/华为云/51CTO;欢迎大家常来逛逛  今天我要给大家分享一些自己日常学习到的一些知识点,并以文字的形式跟大家一起交流,互相学习,一个人虽可以走的更快,但一群人可以走的更远。  我是一名后端开发爱好者,工作日常接触到最多的就是Java语言啦,所以我都尽量抽业余时间把自己所学到所会的,通过文章的形式进行输出,...

开篇语

哈喽,各位小伙伴们,你们好呀,我是喵手。运营社区:C站/掘金/腾讯云/阿里云/华为云/51CTO;欢迎大家常来逛逛

  今天我要给大家分享一些自己日常学习到的一些知识点,并以文字的形式跟大家一起交流,互相学习,一个人虽可以走的更快,但一群人可以走的更远。

  我是一名后端开发爱好者,工作日常接触到最多的就是Java语言啦,所以我都尽量抽业余时间把自己所学到所会的,通过文章的形式进行输出,希望以这种方式帮助到更多的初学者或者想入门的小伙伴们,同时也能对自己的技术进行沉淀,加以复盘,查缺补漏。

小伙伴们在批阅的过程中,如果觉得文章不错,欢迎点赞、收藏、关注哦。三连即是对作者我写作道路上最好的鼓励与支持!

前言

  在 Java 8 引入了 Stream API,这使得数据处理变得更加简洁、高效和表达力强。通过 Stream API,我们能够以声明式的方式处理集合和数组等数据源,极大地提升了代码的可读性和可维护性。今天我们将深入探讨 Stream 的概念与操作中间操作与终端操作过滤、映射与聚合操作,以及 并行流与性能优化

一、Stream 的概念与操作

Stream 是一个可以从数据源(如集合、数组、I/O 通道等)生成的元素的集合,并且通过管道化的操作对这些元素进行处理。Stream 是 不存储数据 的,它们只是数据操作的一个视图或计算过程,每个中间操作都返回一个新的 Stream。

1.1 Stream 的特点

  • 无存储:Stream 并不存储数据,它只是对数据源的一个视图。
  • 函数式编程风格:Stream 使用链式调用,使得数据处理过程更加简洁。
  • 延迟计算:Stream 的操作是懒执行的,只有在执行终端操作时,才会触发数据处理。

1.2 创建 Stream

Stream 可以从多种数据源创建,常见的创建方法包括:

  • 从集合中创建list.stream()
  • 从数组中创建Arrays.stream(array)
  • 从文件中创建Files.lines(path)
  • 使用 Stream.of() 创建Stream.of("a", "b", "c")
代码示例:创建 Stream
import java.util.Arrays;
import java.util.List;
import java.util.stream.Stream;

public class StreamExample {
    public static void main(String[] args) {
        // 从集合中创建 Stream
        List<String> list = Arrays.asList("a", "b", "c");
        list.stream().forEach(System.out::println);  // 使用 forEach 遍历

        // 从数组中创建 Stream
        String[] array = {"1", "2", "3"};
        Arrays.stream(array).forEach(System.out::println);

        // 使用 Stream.of 创建 Stream
        Stream<String> stream = Stream.of("x", "y", "z");
        stream.forEach(System.out::println);
    }
}

二、中间操作与终端操作

Stream API 中的操作可以分为 中间操作终端操作

2.1 中间操作

中间操作返回一个新的 Stream,因此它们是 惰性 的操作。常见的中间操作包括:

  • filter():过滤流中的元素。
  • map():对流中的每个元素进行操作,返回新的元素。
  • flatMap():将元素转换成多个元素并平铺,通常用于嵌套集合的扁平化。
  • sorted():对流中的元素进行排序。
  • distinct():去重操作。

2.2 终端操作

终端操作会触发 Stream 的计算,并且会将结果返回或输出。常见的终端操作包括:

  • forEach():对流中的每个元素进行操作。
  • collect():将 Stream 转换为其他数据结构(如 List、Set、Map)。
  • reduce():通过一个累加器将流中的元素聚合成一个结果。
  • count():返回流中元素的数量。
  • anyMatch()allMatch()noneMatch():用于判断流中的元素是否匹配某些条件。
代码示例:中间操作与终端操作
import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;

public class StreamOperationsExample {
    public static void main(String[] args) {
        List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9);

        // 中间操作:filter 和 map
        List<Integer> result = numbers.stream()
                                      .filter(n -> n % 2 == 0)  // 过滤偶数
                                      .map(n -> n * n)          // 对每个元素平方
                                      .collect(Collectors.toList());  // 终端操作:收集结果
        System.out.println(result);  // 输出: [4, 16, 36, 64]

        // 终端操作:forEach
        numbers.stream().forEach(System.out::println);
    }
}

三、过滤、映射与聚合操作

Stream API 提供了强大的数据处理能力,包括过滤、映射、聚合等操作。

3.1 过滤(Filter)

filter() 中间操作用于过滤符合条件的元素,返回一个新的 Stream。

代码示例:使用 filter() 过滤元素
List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5, 6);
List<Integer> evenNumbers = numbers.stream()
                                   .filter(n -> n % 2 == 0)  // 过滤偶数
                                   .collect(Collectors.toList());
System.out.println(evenNumbers);  // 输出: [2, 4, 6]

3.2 映射(Map)

map() 中间操作用于将流中的每个元素进行转换,并返回新的流。

代码示例:使用 map() 映射元素
List<String> words = Arrays.asList("hello", "world", "java");
List<String> upperCaseWords = words.stream()
                                   .map(String::toUpperCase)  // 将每个字符串转换为大写
                                   .collect(Collectors.toList());
System.out.println(upperCaseWords);  // 输出: [HELLO, WORLD, JAVA]

3.3 聚合操作

Stream 提供了 reduce() 方法用于聚合流中的元素,通常用于求和、求积等操作。

代码示例:使用 reduce() 进行聚合
List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5);
int sum = numbers.stream()
                 .reduce(0, Integer::sum);  // 求和
System.out.println(sum);  // 输出: 15

  reduce() 方法接受两个参数:初始值和一个 BinaryOperator 函数,这里用来对流中的所有元素进行求和操作。


四、并行流与性能优化

4.1 并行流(Parallel Stream)

Java 的 Stream API 支持 并行流,它利用多核 CPU 的优势,将流中的操作并行化。通过 parallelStream()stream().parallel() 方法可以轻松创建并行流。

  • 优势:对于计算密集型任务,使用并行流可以显著提升性能。
  • 劣势:对于 IO 密集型任务,并行流并不会提高性能,反而可能导致线程切换开销增加。
代码示例:使用并行流
List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9);
int sum = numbers.parallelStream()  // 创建并行流
                 .reduce(0, Integer::sum);  // 求和
System.out.println(sum);  // 输出: 45

  在此例中,parallelStream() 创建了一个并行流,流中的元素将由多个线程并行处理,从而提高性能。

4.2 性能优化

  • 避免不必要的操作:Stream 是惰性执行的,但每个中间操作都可能带来性能开销。在实际使用中,应该尽量避免不必要的中间操作。
  • 使用并行流:对于大量的数据处理任务,可以考虑使用并行流进行优化。
  • 减少内存复制:对于大的数据集,尽量避免不必要的内存复制和数据复制。

总结:Stream API 的威力

  通过 Java 8 引入的 Stream API,我们能够以简洁的方式处理集合和数组中的数据。通过流的中间操作和终端操作,开发者可以轻松地进行过滤、映射和聚合等数据处理。并行流提供了一个便捷的方式来充分利用多核 CPU,从而加速计算密集型任务的执行。

  掌握 Stream API,你可以编写更加简洁、高效的代码,轻松应对大规模数据的处理和并行计算任务!

… …

文末

好啦,以上就是我这期的全部内容,如果有任何疑问,欢迎下方留言哦,咱们下期见。

… …

学习不分先后,知识不分多少;事无巨细,当以虚心求教;三人行,必有我师焉!!!

wished for you successed !!!


⭐️若喜欢我,就请关注我叭。

⭐️若对您有用,就请点赞叭。
⭐️若有疑问,就请评论留言告诉我叭。


版权声明:本文由作者原创,转载请注明出处,谢谢支持!

【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。