Stream API:高效处理数据流!
全文目录:
- 开篇语
- 前言
- 一、Stream 的概念与操作
- 1.1 Stream 的特点
- 1.2 创建 Stream
- 代码示例:创建 Stream
- 二、中间操作与终端操作
- 2.1 中间操作
- 2.2 终端操作
- 代码示例:中间操作与终端操作
- 三、过滤、映射与聚合操作
- 3.1 过滤(Filter)
- 代码示例:使用 `filter()` 过滤元素
- 3.2 映射(Map)
- 代码示例:使用 `map()` 映射元素
- 3.3 聚合操作
- 代码示例:使用 `reduce()` 进行聚合
- 四、并行流与性能优化
- 4.1 并行流(Parallel Stream)
- 代码示例:使用并行流
- 4.2 性能优化
- 总结:Stream API 的威力
- 文末
开篇语
哈喽,各位小伙伴们,你们好呀,我是喵手。运营社区: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) {// 从集合中创建 StreamList<String> list = Arrays.asList("a", "b", "c");list.stream().forEach(System.out::println); // 使用 forEach 遍历// 从数组中创建 StreamString[] array = {"1", "2", "3"};Arrays.stream(array).forEach(System.out::println);// 使用 Stream.of 创建 StreamStream<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 和 mapList<Integer> result = numbers.stream().filter(n -> n % 2 == 0) // 过滤偶数.map(n -> n * n) // 对每个元素平方.collect(Collectors.toList()); // 终端操作:收集结果System.out.println(result); // 输出: [4, 16, 36, 64]// 终端操作:forEachnumbers.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 !!!
⭐️若喜欢我,就请关注我叭。
⭐️若对您有用,就请点赞叭。
⭐️若有疑问,就请评论留言告诉我叭。
版权声明:本文由作者原创,转载请注明出处,谢谢支持!