Java中Map、List 和 Set 之间的常见转换方法总结
一、转换方式介绍
以下是 Map
、List
和 Set
之间的常见转换方法总结:
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()
方法,以避免重复元素。 - 排序问题:如果需要有序的
Set
或List
,可以使用LinkedHashSet
或TreeSet
等有序结构。 - 异常处理:在将
List
转换为Map
时,若存在重复的 Key,需提供合并策略,例如:Map<Integer, String> map3 = list.stream().collect(Collectors.toMap(Student::getAge,Student::getName,(existing, replacement) -> existing // 如果有重复Key,保留旧值));
以上是 Java 中 Map
、List
和 Set
之间的常用转换方法。
二、代码示例
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());}
}