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 天前
基于Python的豆瓣电影数据可视化系统构建分析
开发语言·python·信息可视化
步行cgn1 天前
@ResponseBody 详解:Spring MVC 中把返回值直接写入响应体
java·spring·mvc
脏脏a1 天前
延迟与画质:远程控制的生命线
开发语言·php
jason成都1 天前
RTKLIB 的 Java 移植版来了:rtklib-java v3.3.0 功能全景
java·gnss·rtklib·rtklib_java
像风一样的男人@1 天前
python --基于scp的文件传输助手
开发语言·python
一条破秋裤1 天前
SDIO Wi‑Fi 设备的驱动向insmod + 反向rmmod
开发语言·php
LazyHunter91 天前
JDK 28:Java 下一步方向解析与新特性展望
java·jdk
m0_639906941 天前
Java 重写 Override 与重载 Overload 区别、访问修饰符、static 关键字
java·开发语言
Evand J1 天前
【MATLAB例程】平面下,5基站对待定位点的定位。基于距离辅助下的AOA。完整代码下载链接
开发语言·matlab·平面·定位·导航·测距·aoa
GIS数据转换器1 天前
基于CIM的城市智慧供热监管服务平台
java·大数据·开发语言·人工智能·后端·物联网·struts