流式编程终端操作
流式编程终端操作
太棒了!掌握终端操作是流式编程的“最后一公里”,它们是触发流执行的关键,决定了流的最终输出形式。下面我会系统讲解常用终端操作,包括用法、场景和注意事项,帮你彻底吃透!
一、终端操作的核心特点
- 触发执行:所有中间操作(如
filter
、map
)只有在终端操作被调用时才会真正执行(惰性执行的体现)。 - 消费流:终端操作执行后,流会被“消费”,无法再次使用(否则会抛
IllegalStateException
)。 - 返回具体结果:终端操作返回非
Stream
类型的结果(如集合、数值、布尔值等)。
二、常用终端操作分类详解
1. 收集结果:collect(Collector<T, A, R>)
最常用的终端操作,将流转换为集合、映射或其他自定义类型,灵活度极高。
(1)转集合(基础用法)
List<String> list = Arrays.asList("apple", "banana");// 转List(默认ArrayList)
List<String> resultList = list.stream().collect(Collectors.toList());// 转Set(去重,默认HashSet)
Set<String> resultSet = list.stream().collect(Collectors.toSet());// 转具体实现类(如LinkedList保持顺序)
List<String> linkedList = list.stream().collect(Collectors.toCollection(LinkedList::new));
(2)分组与分区(进阶用法)
-
分组(
groupingBy
):按某个字段将元素分组为Map<分组键, List<元素>>
。List<User> users = Arrays.asList(new User("张三", 20, "男"),new User("李四", 25, "男"),new User("王五", 22, "女") );// 按性别分组:Map<String, List<User>> Map<String, List<User>> groupByGender = users.stream().collect(Collectors.groupingBy(User::getGender)); // 结果:{"男": [张三, 李四], "女": [王五]}
-
分区(
partitioningBy
):按布尔条件分为两组(Map<Boolean, List<元素>>
),是分组的特殊情况。// 按年龄是否≥22分区 Map<Boolean, List<User>> partitionByAge = users.stream().collect(Collectors.partitioningBy(u -> u.