ArrayList可通过stream()创建流,链式调用filter()过滤、map()映射,再collect()生成新List,全程不修改原集合;需注意空值防护与顺序保证。

Java 中 ArrayList 可以直接通过 stream() 方法转为流,再用 filter() 和 map() 完成过滤与映射,整个过程不修改原集合,返回新结果(通常是 List)。
基础用法:从 ArrayList 创建流并链式操作
ArrayList 实现了 Collection 接口,自带 stream() 方法。常见写法是:
- 调用
list.stream()获取顺序流 - 用
filter(Predicate)留下符合条件的元素(如非空、大于某值、匹配正则等) - 用
map(Function)转换每个元素(如提取属性、转大写、计算新值) - 最后用
collect(Collectors.toList())收集为新的 ArrayList
示例:筛选偶数并平方
List<Integer> nums = Arrays.asList(1, 2, 3, 4, 5, 6);
List<Integer> result = nums.stream()
.filter(n -> n % 2 == 0) // 过滤出偶数
.map(n -> n * n) // 映射为平方
.collect(Collectors.toList());
// result = [4, 16, 36]
处理对象列表:按属性过滤 + 提取/转换字段
对自定义对象(如 User)操作时,常结合方法引用或 Lambda 访问字段。
立即学习“Java免费学习笔记(深入)”;
将后端 Java 接口文档转换为前端 TypeScript 类型定义(interface / type)。输入:飞书文档、Spring Boot 接口文档、Swagger/OpenAPI、手写 API 文档等。输出:包含请求参数与响应结果的 .md 文件,含完整 JSDoc 注释。触发关键词:Java 转 TS、接口转换、生成前端类型、接口文档转 TypeScript、DTO/VO/BO 转 interface、后端文档转前端类型、生成接口类型、类型定义生成。
-
filter(u -> u.getAge() >= 18)筛选成年人 -
map(User::getName)提取姓名字符串 -
map(u -> new UserInfo(u.getId(), u.getName().toUpperCase()))构造新对象并转换
示例:
record User(Long id, String name, int age) {}
List<User> users = List.of(
new User(1L, "alice", 25),
new User(2L, "bob", 17),
new User(3L, "carol", 30)
);
<p>List<String> adultNames = users.stream()
.filter(u -> u.age() >= 18)
.map(User::name)
.collect(Collectors.toList());
// ["alice", "carol"]
注意空值与异常安全
流操作本身不自动处理 null,需主动防御:
- 过滤前加
Objects::nonNull避免 NPE - 映射中若可能抛异常(如
Integer.parseInt),应包裹 try-catch 或改用 Optional - 若需保留原始顺序且并发安全,用
parallelStream()要谨慎——默认顺序流已保证顺序
防空示例:
List<String> strings = Arrays.asList("1", null, "3", "abc");
List<Integer> safeInts = strings.stream()
.filter(Objects::nonNull)
.filter(s -> s.matches("\d+"))
.map(Integer::parseInt)
.collect(Collectors.toList());
// [1, 3]
进阶:组合多个映射或复用逻辑
可把复杂映射拆成独立函数,提升可读性;也可用 flatMap() 处理一对多关系(如一个订单对应多个商品)。
- 用静态方法或方法引用替代冗长 Lambda:
.map(this::toDisplayName) - 需要“扁平化”时(如 List
→ 所有 OrderItem),用 flatMap(o -> o.getItems().stream()) - 想同时过滤和映射(比如只取非空 name 的长度),可用
map后接filter(Objects::nonNull),顺序影响结果
不复杂但容易忽略。

















