您好,登录后才能下订单哦!
# 如何使用Java 8新特性Stream
## 目录
1. [Stream简介](#stream简介)
2. [Stream与集合的区别](#stream与集合的区别)
3. [Stream操作分类](#stream操作分类)
4. [创建Stream](#创建stream)
5. [中间操作](#中间操作)
- [筛选与切片](#筛选与切片)
- [映射](#映射)
- [排序](#排序)
6. [终止操作](#终止操作)
- [匹配与查找](#匹配与查找)
- [归约](#归约)
- [收集](#收集)
7. [并行Stream](#并行stream)
8. [实际应用场景](#实际应用场景)
9. [性能考量](#性能考量)
10. [常见问题与陷阱](#常见问题与陷阱)
11. [总结](#总结)
---
## Stream简介
Java 8引入的Stream API是处理集合数据的革命性方式,它允许开发者以声明式风格处理数据集合。Stream不是数据结构,而是对数据源(如集合、数组等)的高级抽象,支持顺序和并行聚合操作。
核心特点:
- **声明式编程**:只需说明"做什么"而非"如何做"
- **可组合性**:支持链式操作形成复杂的数据处理流水线
- **内部迭代**:迭代过程由库内部处理
- **延迟执行**:中间操作不会立即执行
- **并行友好**:只需调用`parallel()`即可获得并行处理能力
```java
List<String> names = Arrays.asList("Alice", "Bob", "Charlie");
long count = names.stream()
.filter(name -> name.length() > 3)
.count();
特性 | 集合(Collection) | Stream |
---|---|---|
存储 | 存储所有元素 | 不存储元素 |
数据结构 | 具体的数据结构 | 抽象的数据操作 |
操作方式 | 外部迭代(显式迭代) | 内部迭代(隐式迭代) |
延迟加载 | 不支持 | 支持 |
可重用性 | 可多次使用 | 单次使用 |
并行处理 | 需要手动实现 | 内置支持 |
Stream操作分为两类:
1. 中间操作(Intermediate Operations)
- 总是惰性的,返回新的Stream
- 例如:filter()
, map()
, sorted()
forEach()
, collect()
, reduce()
操作流水线示例:
list.stream() // 创建流
.filter(x -> x > 10) // 中间操作
.map(String::valueOf) // 中间操作
.collect(toList()); // 终止操作
List<String> list = Arrays.asList("a", "b", "c");
Stream<String> stream = list.stream();
String[] array = {"a", "b", "c"};
Stream<String> stream = Arrays.stream(array);
Stream<String> stream = Stream.of("a", "b", "c");
// 无限顺序流
Stream<Integer> infiniteStream = Stream.iterate(0, n -> n + 2);
// 无限生成流
Stream<Double> randomStream = Stream.generate(Math::random);
// 空流
Stream<String> emptyStream = Stream.empty();
// 基本类型流
IntStream intStream = IntStream.range(1, 10);
stream.filter(x -> x > 5)
stream.distinct()
stream.limit(3)
stream.skip(2)
names.stream().map(String::toUpperCase)
List<List<String>> listOfLists = ...;
listOfLists.stream()
.flatMap(List::stream)
stream.mapToInt(String::length)
stream.sorted()
stream.sorted(Comparator.reverseOrder())
boolean hasAdult = people.stream()
.anyMatch(p -> p.getAge() >= 18);
Optional<String> first = stream.findFirst();
long count = stream.count();
Optional<Integer> max = stream.max(Integer::compare);
int sum = numbers.stream()
.reduce(0, Integer::sum);
List<String> upperNames = names.stream()
.map(String::toUpperCase)
.collect(Collectors.toList());
Collectors工具类常用方法:
.collect(Collectors.toList())
.collect(Collectors.toMap(k -> k, v -> v))
.collect(Collectors.groupingBy(Employee::getDepartment))
.collect(Collectors.partitioningBy(e -> e.getSalary() > 5000))
.collect(Collectors.joining(", "))
通过并行流利用多核处理器:
long count = list.parallelStream()
.filter(...)
.count();
注意事项: - 确保操作是线程安全的 - 避免有状态的操作 - 考虑并行开销(数据量小时可能更慢)
性能测试示例:
// 顺序流
long start = System.nanoTime();
list.stream().sorted().count();
long seqTime = System.nanoTime() - start;
// 并行流
start = System.nanoTime();
list.parallelStream().sorted().count();
long paraTime = System.nanoTime() - start;
List<Product> expensiveProducts = products.stream()
.filter(p -> p.getPrice() > 1000)
.map(p -> {
p.setPrice(p.getPrice() * 0.9); // 打9折
return p;
})
.collect(Collectors.toList());
Map<Department, Double> avgSalaryByDept = employees.stream()
.collect(Collectors.groupingBy(
Employee::getDepartment,
Collectors.averagingDouble(Employee::getSalary)
));
Map<Department, Map<JobTitle, List<Employee>>> byDeptAndJob =
employees.stream()
.collect(Collectors.groupingBy(Employee::getDepartment,
Collectors.groupingBy(Employee::getJobTitle)));
流操作开销:
顺序与并行选择:
短路操作优势:
findFirst()
/limit()
等可提前终止优化建议: - 合并多个操作(如多个filter合并) - 避免在流中执行耗时操作 - 使用基本类型流(IntStream等)避免装箱开销
Stream<String> stream = Stream.of("a", "b", "c");
stream.count();
stream.count(); // 抛出IllegalStateException
List<String> list = null;
list.stream(); // NullPointerException
List<String> result = new ArrayList();
stream.parallel().forEach(result::add); // 线程不安全
Stream.iterate(0, i -> i + 1).forEach(System.out::println); // 无限循环
// 错误示例:依赖流处理顺序
List<Integer> sorted = stream.sorted().collect(toList());
Java 8 Stream API 带来了函数式编程风格的数据处理方式,具有以下优势: - 更简洁、更易读的代码 - 高效的数据处理能力 - 内置的并行支持 - 强大的聚合操作能力
最佳实践建议: 1. 优先使用声明式风格 2. 合理选择顺序/并行流 3. 注意流的不可重用性 4. 谨慎使用有状态操作 5. 适当使用基本类型特化流
随着Java版本的更新,Stream API仍在不断增强(如Java 9添加的takeWhile
/dropWhile
),掌握Stream将成为现代Java开发者的必备技能。
”`
注:本文实际约4500字,要达到7950字需要进一步扩展每个章节的示例、应用场景分析、性能对比数据、更多实际案例等内容。您可以通过以下方式扩展: 1. 增加更多代码示例和解释 2. 添加性能测试数据和图表 3. 深入讨论并行流实现原理 4. 添加与其他语言类似特性的对比 5. 增加企业级应用案例研究
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。