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的基本用法,并能够在实际项目中灵活运用。希望这篇博客对你有所帮助!


推荐阅读文章

相关推荐
chenment16 分钟前
ComfyUI 自定义节点开发:从零扩展你的图像生成工作流
python·stable diffusion
腻害兔1 小时前
【若依项目-产品经理视角】RuoYi-Vue-Pro 源码拆解:IM 即时通讯模块,一个被低估的「全功能聊天系统」
java·前端·vue.js·产品经理·ai编程
互联网中的一颗神经元1 小时前
小白python入门 - 25. SQL 与表设计入门
数据库·python·sql
心念枕惊1 小时前
.NET CORE 授权进阶-角色、策略与动态权限实现
java·前端·.netcore
RSTJ_16253 小时前
PYTHON+AI LLM DAY ONE HUNDRED AND EIGHTEEN
python
开源量化GO3 小时前
近期量化学习路径,交易理解和技术实现要接上
人工智能·python
景同学3 小时前
把 AI 用到线上运维:可行、有效,前提是喂足信息——一次 Full GC 排障实录
java·人工智能·后端
C++、Java和Python的菜鸟3 小时前
第7章 后端Web实战(Tlias系统)
java
tkevinjd4 小时前
MiniCode 项目详解7:Memory 记忆系统
大数据·python·搜索引擎·llm·agent
憧憬成为java架构高手的小白4 小时前
黑马八股--spring框架学习
java·学习·spring