Java Stream 流式操作举例 - 详解


Java Stream 流式操作实战示例

1. 基础示例:过滤、映射、收集

List<
String> fruits = List.of("apple", "banana", "cherry", "avocado");
List<
String> result = fruits.stream()
.filter(f -> f.startsWith("a")) // 过滤出 a 开头
.map(String::toUpperCase) // 转大写
.toList();
// 收集到 List
System.out.println(result);
// [APPLE, AVOCADO]

2. Map 流式操作:找出成绩优秀的同学

Map<
String, Integer> scores = Map.of("Tom", 90, "Jerry", 80, "Anna", 95);
List<
String> topStudents = scores.entrySet().stream()
.filter(e -> e.getValue() >
85) // 过滤成绩 > 85
.map(Map.Entry::getKey) // 提取姓名
.toList();
System.out.println(topStudents);
// [Tom, Anna]

3. 排序与去重

List<
Integer> numbers = List.of(5, 3, 9, 1, 3, 5);
List<
Integer> result = numbers.stream()
.distinct() // 去重
.sorted() // 排序
.toList();
System.out.println(result);
// [1, 3, 5, 9]

4. 聚合计算:reduce

List<
Integer> numbers = List.of(1, 2, 3, 4, 5);
// 求和
int sum = numbers.stream()
.reduce(0, Integer::sum);
System.out.println(sum);
// 15

5. 分组统计:groupingBy

List<
String> words = List.of("apple", "ant", "banana", "bat", "cherry");
Map<
Character, List<
String>
> grouped = words.stream()
.collect(Collectors.groupingBy(w -> w.charAt(0)));
// 按首字母分组
System.out.println(grouped);
// {a=[apple, ant], b=[banana, bat], c=[cherry]}

6. 统计操作

List<
Integer> numbers = List.of(10, 20, 30, 40);
IntSummaryStatistics stats = numbers.stream()
.mapToInt(Integer::intValue)
.summaryStatistics();
System.out.println(stats.getCount());
// 4
System.out.println(stats.getSum());
// 100
System.out.println(stats.getAverage());
// 25.0

7. 扁平化 flatMap

List<
List<
String>
> nested = List.of(
List.of("a", "b"),
List.of("c", "d", "e")
);
List<
String> flat = nested.stream()
.flatMap(List::stream) // 展平成单一流
.toList();
System.out.println(flat);
// [a, b, c, d, e]

8. 文件流式处理(行处理)

try (Stream<
String> lines = Files.lines(Path.of("data.txt"))) {
long count = lines
.filter(line -> line.contains("error"))
.count();
System.out.println("包含 error 的行数: " + count);
} catch (IOException e) {
e.printStackTrace();
}

9. 无限流:生成数据流

List<
Integer> first10Even = Stream.iterate(0, n -> n + 2) // 从0开始,每次+2
.limit(10) // 取前10个
.toList();
System.out.println(first10Even);
// [0, 2, 4, 6, 8, 10, 12, 14, 16, 18]

10. 并行流:加速处理大集合

List<
Integer> numbers = IntStream.range(1, 1_000_000).boxed().toList();
long count = numbers.parallelStream() // 并行流
.filter(n -> n % 2 == 0)
.count();
System.out.println("偶数个数: " + count);
// 500000

✨ 总结

  • 集合流stream(),常用 filter/map/sorted/distinct
  • Map流:从 entrySet()/keySet()/values() 开始
  • 聚合统计reduceCollectors.groupingBysummaryStatistics
  • 文件流Files.lines(),边读边处理,避免内存爆炸
  • 无限流Stream.iterate/generate,适合模拟数据流
  • 并行流parallelStream(),多核加速大数据处理

posted @ 2025-09-06 15:57  yjbjingcha  阅读(7)  评论(0)    收藏  举报