Map&Stream流

1. 三大常用 Map 区别

  1. HashMap
    • 无序、键唯一、线程不安全
    • 允许null键 1 个,多个null值
    • 底层:数组 + 链表 + 红黑树(JDK1.8)
    • 默认容量 16,负载因子 0.75,扩容 2 倍
  2. LinkedHashMap
    • 有序(插入顺序),继承 HashMap
    • 底层多一条双向链表维护顺序
  3. TreeMap
    • 自然排序(key 升序)
    • 底层红黑树,key 必须实现 Comparable
    • 不允许 null 键

2. Map 常用方法

复制代码
map.put(k,v)      // 添加/覆盖
map.get(k)        // 取值
map.remove(k)     // 删除
map.containsKey(k) // 判断键
map.containsValue(v)// 判断值
map.size()        // 长度
map.clear()       // 清空
map.isEmpty()     // 是否为空

3. Map 三种遍历

复制代码
// 1. 遍历key
for (String k : map.keySet()){}

// 2. 遍历value
for (Integer v : map.values()){}

// 3. 遍历键值对【最优】
for (Map.Entry<K,V> e : map.entrySet()){
    e.getKey();
    e.getValue();
}

4. Map 简洁写法(JDK8)

复制代码
map.forEach((k,v)-> System.out.println(k+v));
map.getOrDefault("key",0); // 无key返回默认值
map.putIfAbsent(k,v);      // 不存在才添加

二、Stream 流(集合最强操作)

1. 三大步骤

创建流 → 中间操作(链式) → 终止操作

2. 流创建

复制代码
list.stream()        // 集合串行流
list.parallelStream()// 并行流
Stream.of(1,2,3)     // 快速创建

3. 常用中间操作(返回流,可链式)

  • filter(条件):过滤
  • map():类型转换 / 提取字段(最常用)
  • sorted():排序
  • distinct():去重
  • limit(n):取前 n 个
  • skip(n):跳过前 n 个

4. 常用终止操作(关闭流)

  • forEach():遍历
  • collect():收集成集合最重要
  • count():统计数量
  • max/min():最值
  • anyMatch/allMatch:匹配判断

5. 高频实战代码

复制代码
// 1. 过滤+收集
List<User> list = users.stream()
    .filter(u->u.getAge()>18)
    .collect(Collectors.toList());

// 2. map提取字段
List<String> names = users.stream()
    .map(User::getName)
    .collect(Collectors.toList());

// 3. 排序
list.stream().sorted(Comparator.comparing(User::getAge));

// 4. 分组(Stream转Map)
Map<Integer,List<User>> groupMap = users.stream()
    .collect(Collectors.groupingBy(User::getAge));

// 5. 转Map
Map<Long,String> idNameMap = users.stream()
    .collect(Collectors.toMap(User::getId,User::getName));

6. Collectors 常用收集

  • toList() → List
  • toSet() → 去重 Set
  • groupingBy() → 分组 Map
  • joining() → 字符串拼接
  • summingInt() → 求和
  • averagingInt() → 求平均

三、Map + Stream 联合用法

复制代码
// Map遍历转流
map.entrySet().stream()
   .filter(e->e.getValue()>100)
   .forEach(System.out::println);

// List转Map
List<Student> -> Map<学号,姓名>
list.stream().collect(Collectors.toMap(Student::getId,Student::getName));
相关推荐
小黄人软件1 分钟前
粘贴助手C++版 支持 Windows 7 / 10 / 11 不会出现缺少api-ms-win-core-path-11-1-0.dll
开发语言·c++·windows
vx_Biye_Design5 分钟前
springboot旅游管理系统18006-计算机课程设计、毕业设计
java·spring boot·后端·python·elasticsearch·django·课程设计
Wang's Blog9 分钟前
Java 中间件之 RabbitMQ 快速入门: 简单队列模型快速入门
java·中间件·java-rabbitmq
半亩码田12 分钟前
C#转Python第4.7篇:logging:Python 的标准日志库
开发语言·python·c#
程序员老陆13 分钟前
从汇编层面理解 C++ 多线程
开发语言·c++·程序设计
骇客野人17 分钟前
Java 开发组件大全覆盖后端主流技术栈(基础、Web、ORM、中间件、微服务、安全、工具、测试、运维、信创适配常用组件)
java·前端·中间件
谢亮_vipxieliang21 分钟前
深入理解 JavaScript 数据类型与类型转换
开发语言·javascript·ecmascript
IOT-Power29 分钟前
模板方法 + 策略模式
开发语言·c++
EatFan34 分钟前
2026 Rust 后端技术栈选型:Axum 0.8 + Tokio + SQLx 全链路怎么搭
开发语言·后端·rust·tokio·serde·axum·sqlx
外收内放35 分钟前
Python基础语法练习题(59-原始版本与优化版本)
开发语言·python