精心整理了最新的面试资料和简历模板,有需要的可以自行获取
一、Stream流概述
Java 8引入的Stream API为集合操作带来了革命性改进,它结合Lambda表达式实现了声明式编程风格,支持并行处理,显著提升了开发效率和代码可读性。
核心特性:
- 流水线操作:支持链式调用
- 惰性求值:中间操作延迟执行
- 不可变性:不修改原始数据源
- 并行支持:parallel()轻松实现并行处理
与传统集合的区别:
// 传统方式
for (Integer num : list) {
if (num > 5) {
System.out.println(num);
}
}
// Stream方式
list.stream()
.filter(n -> n > 5)
.forEach(System.out::println);
二、Stream操作分类
1. 创建流
// 集合创建
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<Integer> numbers = Stream.of(1, 2, 3);
Stream<Double> randoms = Stream.generate(Math::random).limit(5);
2. 中间操作(返回新流)
操作 | 描述 | 示例 |
---|---|---|
filter() | 条件过滤 | .filter(s -> s.length() > 3) |
map() | 元素转换 | .map(String::toUpperCase) |
sorted() | 排序 | .sorted(Comparator.reverseOrder()) |
distinct() | 去重 | .distinct() |
limit() | 数量限制 | .limit(10) |
示例组合:
List<String> result = list.stream()
.filter(s -> s.startsWith("A"))
.map(String::toLowerCase)
.sorted()
.collect(Collectors.toList());
3. 终止操作(触发计算)
类型 | 常用方法 |
---|---|
遍历 | forEach(), forEachOrdered() |
统计 | count(), max(), min(), average() |
匹配 | anyMatch(), allMatch() |
收集 | collect(), toArray() |
归约 | reduce() |
收集器示例:
// 转换为Map
Map<String, Integer> map = people.stream()
.collect(Collectors.toMap(
Person::getName,
Person::getAge
));
// 分组统计
Map<String, Long> countByCity = people.stream()
.collect(Collectors.groupingBy(
Person::getCity,
Collectors.counting()
));
三、高级应用技巧
1. 并行流处理
long count = list.parallelStream()
.filter(s -> s.contains("error"))
.count();
2. 对象属性提取
List<String> names = employees.stream()
.map(Employee::getName)
.collect(Collectors.toList());
3. 多重数据处理
List<String> words = Arrays.asList("Hello", "World");
List<String> letters = words.stream()
.flatMap(word -> Arrays.stream(word.split("")))
.collect(Collectors.toList());
// 输出: [H, e, l, l, o, W, o, r, l, d]
4. 数值流优化
IntStream.rangeClosed(1, 100)
.average()
.ifPresent(System.out::println);
四、最佳实践与注意事项
- 避免副作用:保持lambda表达式纯净
- 优先使用方法引用:提高可读性
- 适时使用并行:数据量>10000时考虑
- 资源管理:关闭IO相关流(如Files.lines())
- 调试技巧:
.peek(System.out::println) // 查看中间结果
五、性能比较
操作类型 | 数据量=1万 | 数据量=100万 |
---|---|---|
传统循环 | 15ms | 1200ms |
顺序流 | 18ms | 1300ms |
并行流 | 25ms | 450ms |
测试环境:JDK17,i7-11800H处理器
六、总结
适用场景:
- 集合元素处理/转换
- 数据筛选/统计
- 多级数据处理
- 大数据量并行计算
优势:
- 代码简洁度提升40%-60%
- 并行处理效率提升3-5倍
- 支持函数式编程范式