Java中的Stream API:从入门到实战

引言

在现代Java开发中,Stream API 是处理集合数据的强大工具。它不仅让代码更加简洁易读,还能通过并行处理提升性能。本文将带你从基础概念入手,逐步深入Stream API的使用,并通过实战案例展示其强大功能。

1. 什么是Stream API?

Stream API 是Java 8引入的一个新特性,用于处理集合数据。它允许你以声明式的方式对数据进行操作,比如过滤、映射、排序等。Stream API的核心思想是将数据操作分为中间操作终端操作

  • 中间操作 :如 filter()map()sorted(),它们返回一个新的Stream,可以链式调用。
  • 终端操作 :如 collect()forEach()reduce(),它们触发Stream的处理并返回结果。

2. Stream API的核心操作

2.1 创建Stream

Stream可以通过多种方式创建:

java 复制代码
// 从集合创建
List<String> list = Arrays.asList("Java", "Python", "C++");
Stream<String> stream = list.stream();

// 从数组创建
Stream<String> arrayStream = Arrays.stream(new String[]{"A", "B", "C"});

// 使用Stream.of()
Stream<Integer> numberStream = Stream.of(1, 2, 3, 4);

2.2 中间操作

  • filter():过滤元素
java 复制代码
List<String> languages = Arrays.asList("Java", "Python", "C++", "JavaScript");
List<String> filtered = languages.stream()
                                 .filter(lang -> lang.startsWith("J"))
                                 .collect(Collectors.toList());
// 结果: ["Java", "JavaScript"]
  • map():转换元素
java 复制代码
List<String> languages = Arrays.asList("Java", "Python", "C++");
List<Integer> lengths = languages.stream()
                                 .map(String::length)
                                 .collect(Collectors.toList());
// 结果: [4, 6, 3]
  • sorted():排序
java 复制代码
List<String> sortedLanguages = languages.stream()
                                        .sorted()
                                        .collect(Collectors.toList());
// 结果: ["C++", "Java", "JavaScript", "Python"]

2.3 终端操作

  • collect():将Stream转换为集合
java 复制代码
List<String> result = stream.collect(Collectors.toList());
  • forEach():遍历元素
java 复制代码
languages.stream().forEach(System.out::println);
  • reduce():归约操作
java 复制代码
Optional<String> combined = languages.stream()
                                     .reduce((s1, s2) -> s1 + ", " + s2);
// 结果: "Java, Python, C++"

3. 并行Stream

Stream API 支持并行处理,只需将 stream() 替换为 parallelStream() 即可:

java 复制代码
List<String> languages = Arrays.asList("Java", "Python", "C++", "JavaScript");
List<String> result = languages.parallelStream()
                               .filter(lang -> lang.length() > 3)
                               .collect(Collectors.toList());

4. 实战案例:统计文本中的单词频率

假设我们有一段文本,需要统计每个单词出现的频率:

java 复制代码
String text = "Java is a programming language Java is widely used";
Map<String, Long> wordCounts = Arrays.stream(text.split(" "))
                                     .collect(Collectors.groupingBy(Function.identity(), Collectors.counting()));
// 结果: {Java=2, is=2, a=1, programming=1, language=1, widely=1, used=1}

5. 注意事项

  • Stream是一次性的:一旦被消费,就不能重复使用。
  • 避免副作用:Stream操作应尽量保持无状态,避免修改外部变量。
  • 性能权衡:并行Stream并不总是更快,需根据数据量和操作复杂度评估。

6. 总结

Stream API 是Java中处理集合数据的利器,它让代码更加简洁、易读且高效。通过本文的学习,你应该已经掌握了Stream的基本用法,并能够在实际项目中灵活运用。希望这篇博客对你有所帮助!


推荐阅读文章

相关推荐
问今域中几秒前
Spring Security + JWT
java·后端·spring
我命由我123453 分钟前
Android 项目路径包含非 ASCII 字符问题:Your project path contains non-ASCII characters
android·java·java-ee·android studio·android jetpack·android-studio·android runtime
我是海飞7 分钟前
杰理 AC792N WebSocket 客户端例程使用测试教程
c语言·python·单片机·websocket·网络协议·嵌入式·杰理
沛沛老爹8 分钟前
Web开发者突围AI战场:Agent Skills元工具性能优化实战指南——像优化Spring Boot一样提升AI吞吐量
java·开发语言·人工智能·spring boot·性能优化·架构·企业开发
Full Stack Developme11 分钟前
Redis 实现主从同步
java·redis·spring
yangminlei12 分钟前
Spring Boot 响应式 WebFlux 从入门到精通
java·spring boot·后端
曹轲恒17 分钟前
SpringBoot配置文件
java·spring boot
小范馆18 分钟前
解决 Windows 11 安装时提示 “不支持 TPM 2.0” 和 “不支持安全启动” 的问题
windows·安全
shy^-^cky18 分钟前
Python程序设计完整复习要点(含实例)
python·期末复习