流式编程终端操作

发布于:2025-08-02 ⋅ 阅读:(15) ⋅ 点赞:(0)

流式编程终端操作

太棒了!掌握终端操作是流式编程的“最后一公里”,它们是触发流执行的关键,决定了流的最终输出形式。下面我会系统讲解常用终端操作,包括用法、场景和注意事项,帮你彻底吃透!

一、终端操作的核心特点

  • 触发执行:所有中间操作(如filtermap)只有在终端操作被调用时才会真正执行(惰性执行的体现)。
  • 消费流:终端操作执行后,流会被“消费”,无法再次使用(否则会抛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.

网站公告

今日签到

点亮在社区的每一天
去签到