当前位置: 首页 > news >正文

Java中Map、List 和 Set 之间的常见转换方法总结

一、转换方式介绍

以下是 MapListSet 之间的常见转换方法总结:


1. List → Set

  • 使用 HashSet 构造函数

    Set<Student> sSet = new HashSet<>(sList);
    
  • 使用 Stream 流

    Set<Student> sSet1 = sList.stream().collect(Collectors.toSet());
    

2. Set → List

  • 使用 ArrayList 构造函数

    List<Student> sList1 = new ArrayList<>(sSet2);
    
  • 使用 Stream 流

    List<Student> sList2 = sSet2.stream().collect(Collectors.toList());
    

3. Set → Map

  • 使用 Stream 流 + Collectors.toMap()
    Map<Integer, String> smap = sSet3.stream().collect(Collectors.toMap(Student::getAge, Student::getName));
    

4. Map → Set

  • 获取键的集合

    Set<Integer> keySet = map1.keySet();
    Set<Integer> keySet2 = new HashSet<>(map1.keySet());
    
  • 获取值的集合并转为 Set

    • 使用 Stream 流:

      Set<String> valueSet = map1.values().stream().collect(Collectors.toSet());
      
    • 使用 HashSet 构造器:

      Set<String> valueSet1 = new HashSet<>(map1.values());
      

5. Map → List

  • 获取键或值的集合并转为 List
    List<Student> valueList = new ArrayList<>(map2.keySet());
    

6. List → Map

  • 使用 Stream 流 + Collectors.toMap()
    Map<Integer, String> map3 = list.stream().collect(Collectors.toMap(Student::getAge, Student::getName));
    

7. 注意事项

  • 去重处理:当 List 转换为 Set 时,确保对象正确实现 equals()hashCode() 方法,以避免重复元素。
  • 排序问题:如果需要有序的 SetList,可以使用 LinkedHashSetTreeSet 等有序结构。
  • 异常处理:在将 List 转换为 Map 时,若存在重复的 Key,需提供合并策略,例如:
    Map<Integer, String> map3 = list.stream().collect(Collectors.toMap(Student::getAge,Student::getName,(existing, replacement) -> existing // 如果有重复Key,保留旧值));
    

以上是 Java 中 MapListSet 之间的常用转换方法。

二、代码示例

package com;import java.util.*;
import java.util.stream.Collectors;public class Main {public static void main(String[] args) {class Student implements  Comparable<Student>{public int getAge() {return age;}public void setAge(int age) {this.age = age;}public String getName() {return name;}public void setName(String name) {this.name = name;}private int age;private String name;public Student(int age, String name) {this.age = age;this.name = name;}@Overridepublic boolean equals(Object o) {if (this == o) return true;if (o == null || getClass() != o.getClass()) return false;Student student = (Student) o;return age == student.age && Objects.equals(name, student.name);}@Overridepublic int hashCode() {return Objects.hash(age, name);}@Overridepublic int compareTo(Student o) {return o.age-this.age;}@Overridepublic String toString() {return "Student{" +"age=" + age +", name='" + name + '\'' +'}';}}System.out.println("-------List(ArrayList)——>Set集合----------");/*** List(ArrayList)——>Set集合*/// HashSet构造器传入ListList<Student> sList =new ArrayList<>();sList.add(new Student(18,"zhangsan1"));sList.add(new Student(19,"zhangsan2"));sList.add(new Student(20,"zhangsan3"));Set<Student> sSet = new HashSet<>(sList); //System.out.println(sSet);System.out.println(sSet.getClass());// 使用stream流Set<Student> sSet1 = sList.stream().collect(Collectors.toSet()); //System.out.println(sSet1);System.out.println(sSet1.getClass());System.out.println("-------Set——>List(ArrayList)----------");/*** Set——>List(ArrayList)*///List构造器方法Set< Student> sSet2 = new HashSet<>();sSet2.add(new Student(18,"zhangsan1"));sSet2.add(new Student(19,"zhangsan2"));sSet2.add(new Student(20,"zhangsan3"));List<Student> sList1 = new ArrayList<>(sSet2); //System.out.println(sList1);System.out.println(sList1.getClass());//stream流List<Student> sList2 = sSet2.stream().collect(Collectors.toList()); //System.out.println(sList2);System.out.println(sList2.getClass());System.out.println("-------Set——>Map----------");/*** Set——>Map*/Set< Student> sSet3 = new HashSet<>();sSet3.add(new Student(18,"zhangsan1"));sSet3.add(new Student(19,"zhangsan2"));sSet3.add(new Student(20,"zhangsan3"));//stream流Map<Integer,String> smap = sSet3.stream().collect(Collectors.toMap(Student::getAge,Student::getName));System.out.println(smap);System.out.println(smap.getClass());System.out.println("-------Map——>Set----------");/*** Map——>Set*///将Map的全部键转为SetMap<Student,String> map1 = new HashMap<>();map1.put(new Student(18,"zhangsan1"),"zhangsan1");map1.put(new Student(19,"zhangsan2"),"zhangsan2");map1.put(new Student(20,"zhangsan3"),"zhangsan3");Set<Student> keySet = map1.keySet();Set<String> keySet2 = new HashSet<>(map1.values());System.out.println(keySet);System.out.println(keySet.getClass());System.out.println(keySet2);System.out.println(keySet2.getClass());//将Map的全部值转为Set//stream流Set<String> valueSet = map1.values().stream().collect(Collectors.toSet());System.out.println(valueSet);System.out.println(valueSet.getClass());//使用HashSet的构造器接住map.values()的返回值Set<String> valueSet1 = new HashSet<>(map1.values());System.out.println(valueSet1);System.out.println(valueSet1.getClass());System.out.println("-------Map——>List----------");/*** Map——>List*/Map<Student,String> map2 = new HashMap<>();map2.put(new Student(18,"zhangsan1"),"zhangsan1");map2.put(new Student(19,"zhangsan2"),"zhangsan2");map2.put(new Student(20,"zhangsan3"),"zhangsan3");List<Student> valueList = new ArrayList<>(map2.keySet());System.out.println(valueList);System.out.println(valueList.getClass());System.out.println("-------List——>Map----------");/*** List——>Map*/List<Student> list = new ArrayList<>();list.add(new Student(18,"zhangsan1"));list.add(new Student(19,"zhangsan2"));list.add(new Student(20,"zhangsan3"));Map<Integer,String> map3 = list.stream().collect(Collectors.toMap(Student::getAge,Student::getName));System.out.println(map3);System.out.println(map3.getClass());}
}
http://www.dtcms.com/a/270734.html

相关文章:

  • vcpkg交叉编译qt等过程记录(未完成)
  • HarmonyOS应用开发者高级试题2025年7月部分单选题(带答案)
  • 学习日记-spring-day44-7.9
  • C++随机打乱函数:简化源码与原理深度剖析
  • leetcode11.盛最多水的容器
  • Webpack、Vite配置技巧与CI/CD流程搭建全解析
  • 【RTSP从零实践】9、多播传输AAC格式的RTP包(附带源码)
  • mac m1安装大模型工具vllm
  • kotlin学习,val使用get()的问题
  • mysql 安装实战
  • Claude Code 开发使用技巧
  • User手机上如何抓取界面的布局uiautomatorviewer
  • Linux的`if test`和`if [ ]中括号`的取反语法比较 笔记250709
  • Unity Demo-3DFarm详解-其二
  • 以太坊智能合约核心技术解析与应用实践
  • LLaMA-Omni 深度解析:打开通往无缝人机语音交互的大门
  • HCIP 认证可以做什么?如何选择合适的职业路径?
  • C++11 future、promise实现原理
  • AI生成交互式数据图表
  • 【c++八股文】Day5:const和constexpr,define
  • sql查询davinci看板数据
  • 【一起来学AI大模型】PyTorch DataLoader 实战指南
  • 极简相册管理ios app Tech Support
  • ARM汇编编程(AArch64架构)课程 - 第7章:SIMD与浮点运算
  • 2025杰理蓝牙芯片:各系列芯片特点及市场分析
  • 【手写 new 操作符实现 - 深入理解 JavaScript 对象创建机制】
  • 【Linux】权限的概念及理解
  • VR/AR在HMI中的创新应用:远程协作与维修的沉浸式体验
  • 类和对象拓展——日期类
  • 【实习篇】之Http头部字段之Disposition介绍