Java 8 Stream API

一、Stream API 的核心概念

  1. 流(Stream)

    代表数据元素的序列,支持顺序或并行操作。

  2. 中间操作(Intermediate Operations)

    返回新流的操作(如 filter, map, sorted),支持链式调用。

  3. 终端操作(Terminal Operations)

    触发流的遍历并生成结果(如 collect, forEach, reduce)。


二、Stream 的创建方式

1. 从集合创建
java 复制代码
List<String> list = Arrays.asList("apple", "banana", "cherry");
Stream<String> stream = list.stream(); // 顺序流
Stream<String> parallelStream = list.parallelStream(); // 并行流
2. 直接生成元素
java 复制代码
Stream<String> stream = Stream.of("a", "b", "c");
Stream<Integer> infiniteStream = Stream.iterate(0, n -> n + 1); // 无限流
3. 从数组或文件生成
java 复制代码
String[] array = {"a", "b", "c"};
Stream<String> arrayStream = Arrays.stream(array);

// 从文件生成流(逐行读取)
try (Stream<String> lines = Files.lines(Paths.get("data.txt"))) {
    lines.forEach(System.out::println);
} catch (IOException e) {
    e.printStackTrace();
}

三、常用中间操作

1. filter(Predicate<T>):过滤元素
java 复制代码
List<String> filtered = list.stream()
    .filter(s -> s.startsWith("a")) // 保留以 "a" 开头的字符串
    .collect(Collectors.toList());
2. map(Function<T, R>):转换元素
java 复制代码
List<Integer> lengths = list.stream()
    .map(String::length) // 将字符串映射为其长度
    .collect(Collectors.toList());
3. sorted() / sorted(Comparator<T>):排序
java 复制代码
List<String> sorted = list.stream()
    .sorted() // 自然排序
    .collect(Collectors.toList());

List<String> customSorted = list.stream()
    .sorted((s1, s2) -> s2.compareTo(s1)) // 自定义排序(逆序)
    .collect(Collectors.toList());
4. distinct():去重
java 复制代码
List<String> unique = list.stream()
    .distinct()
    .collect(Collectors.toList());
5. limit(n) / skip(n):截取或跳过元素
java 复制代码
List<String> limited = list.stream()
    .limit(2) // 取前2个元素
    .collect(Collectors.toList());

四、常用终端操作

1. collect(Collector):将流转换为集合或其他结构
java 复制代码
List<String> list = stream.collect(Collectors.toList());
Set<String> set = stream.collect(Collectors.toSet());
String joined = stream.collect(Collectors.joining(", "));
2. forEach(Consumer<T>):遍历元素
java 复制代码
stream.forEach(System.out::println);
3. reduce():归约操作
java 复制代码
Optional<String> concatenated = stream.reduce((s1, s2) -> s1 + s2);
int sum = Stream.of(1, 2, 3).reduce(0, Integer::sum);
4. count() / anyMatch() / allMatch() / noneMatch()
java 复制代码
long count = stream.count();
boolean hasA = stream.anyMatch(s -> s.contains("a"));

五、并行流(Parallel Stream)

利用多核处理器加速处理:

java 复制代码
List<String> result = list.parallelStream()
    .filter(s -> s.length() > 3)
    .collect(Collectors.toList());

六、Stream 的特性

  1. 不可复用:一个流只能被消费一次。

  2. 延迟执行:中间操作不会立即执行,直到触发终端操作。

  3. 链式调用:支持函数式编程风格。


七、示例:完整操作链

java 复制代码
List<String> words = Arrays.asList("apple", "banana", "cherry", "date", "fig");

List<String> result = words.stream()
    .filter(s -> s.length() > 3)    // 过滤长度>3的单词
    .map(String::toUpperCase)       // 转为大写
    .sorted()                       // 按字母排序
    .collect(Collectors.toList());  // 收集为List

System.out.println(result); // 输出 [APPLE, BANANA, CHERRY, DATE]

八、Stream vs 传统循环

特性 Stream API 传统循环(for/while)
代码风格 声明式(关注"做什么") 命令式(关注"怎么做")
并行支持 内置并行处理(parallelStream 需手动实现多线程
可读性 链式调用,逻辑清晰 嵌套复杂时可能难读
性能 小数据量可能稍慢,大数据量优化 直接控制,通常更快

九、使用场景

  • 适合 Stream

    数据过滤、转换、统计等函数式操作,尤其是需要并行处理的场景。

  • 适合传统循环

    需要直接控制迭代过程(如复杂条件中断、修改外部变量)。

相关推荐
m0_5873830017 分钟前
智慧场馆解决方案实战指南:从系统架构到落地部署全解析
java·spring boot·架构·系统架构
ZC跨境爬虫22 分钟前
LeetCode 13. 罗马数字转整数(多解法详解 + Java Python 实现)
java·python·leetcode
省长27 分钟前
Sa-Token v1.46.0 发布 🚀,来看看有没有令你心动的功能!
java·后端·开源
LayZhangStrive1 小时前
融360 一面
java·面试·后端开发
城管不管1 小时前
重生——第十次面试之开源中国一面挂
java·linux·开发语言·算法·面试·职场和发展·开源
Java小白笔记1 小时前
Windows系统免软件命令激活
java·网络·人工智能·windows·ai·ai编程
爱敲键盘的猴子1 小时前
深入理解 Java HashMap
java·hashmap
霸道流氓气质1 小时前
Java开发者AI编程常用MCP、Skills、Rules全景汇总
java·开发语言·ai编程
天涯醉青楼2 小时前
Spring Boot 接口返回 Bean 时字段名“变形”的深度剖析与解决方案
java
步行cgn2 小时前
MyBatis 高级映射与延迟加载完全指南
java·tomcat·mybatis