Java中 Map转List 、 List转Map 简单好用
1.1 将Map的key转换为List
public void testMapToList(){ // 创建一个Map Map<String, Integer> map = new HashMap<>(); map.put("key1", 1); map.put("key2", 2); map.put("key3", 3); // 将Map的key转换为List List<String> keyList = new ArrayList<>(map.keySet()); // 打印结果 System.out.println(keyList); }
输出:
[key1, key2, key3]
1.2 将Map的value转换为List
public void testMapToList(){ // 创建一个Map Map<String, Integer> map = new HashMap<>(); map.put("key1", 1); map.put("key2", 2); map.put("key3", 3); // 将Map的value转换为List List<Integer> keyList = new ArrayList<>(map.values()); // 打印结果 System.out.println(keyList); }
输出:
[1, 2, 3]
所以说这两个方法的区别就是在
new ArrayList<>
时选择使用map.values()
还是map.keySet()
2.1 最普通的List转Map
public void testListToMap(){ // 创建一个List List<String> list = new ArrayList<>(); list.add("key1"); list.add("key2"); list.add("key3"); // 将List转换为Map Map<String, Integer> map = list.stream() .collect(Collectors.toMap(key -> key, value -> 0, (v1, v2) -> v1)); // value里默认放一个0 // 打印结果 System.out.println(map); }
输出:
{key1=0, key2=0, key3=0}
要特别注意里面的
(v1, v2) -> v1)
必须带上。如果你的key里重复的时候没这句话会异常:
java.lang.IllegalStateException: Duplicate key 0
(v1, v2) -> v1
表示当出现重复的键时,选择保留原始的值 v1
,而忽略新值 v2
。
如果你希望在出现重复的键时采取其他操作,例如取最大值、取最小值或者进行求和等操作,您可以在合并函数中编写相应的逻辑。例如,可以使用(v1, v2) -> Math.max(v1, v2)
来选择两个值中的最大值。
2.2 List转Map同时保证顺序
假如我的list的放入顺序变了:
List<String> list = new ArrayList<>(); list.add("key3"); list.add("key2"); list.add("key1");
用第一个方式得到的Map是乱序的,如果想保证顺序,可以借助LinkedHashMap
.
public void testListToMap(){ // 创建一个List List<String> list = new ArrayList<>(); list.add("key3"); list.add("key2"); list.add("key1"); // 将List转换为Map Map<String, Integer> map = list.stream() .collect(Collectors.toMap(key -> key, value -> 0, (v1, v2) -> v1, LinkedHashMap::new)); // value里默认放一个0 // 打印结果 System.out.println(map); }
输出:
{key3=0, key2=0, key1=0}
2.3 List转Map(对象类型且key拼接)
假如有这个User
:
@Data @AllArgsConstructor @NoArgsConstructor @Builder public static class User{ private Integer id; private String name; private Integer age; }
想要id
拼接_
拼接name
作为key
,age
作为value
,转Map。代码:
public void testListToMap2() { // 创建一个List List<User> list = new ArrayList<>(); list.add(new User(1,"Tom",10)); list.add(new User(2,"Tim",10)); list.add(new User(3,"Jim",10)); // 将List转换为Map Map<String, Integer> map = list.stream() .collect(Collectors.toMap(key -> key.getId()+"_"+key.getName(), value -> value.getAge(), (v1, v2) -> v1)); System.out.println(JSON.toJSON(map)); }
输出:
{"3_Jim":10,"2_Tim":10,"1_Tom":10}
2.4 List转Map(id作为key,每个元素作为value)
public void testListToMap2() { // 创建一个List List<User> list = new ArrayList<>(); list.add(new User(1,"Tom",10)); list.add(new User(2,"Tim",10)); list.add(new User(3,"Jim",10)); // 将List转换为Map Map<Integer, User> map = list.stream() .collect(Collectors.toMap(User::getId, value -> value, (v1, v2) -> v1)); System.out.println(JSON.toJSON(map)); }
输出:
{"1": {"name": "Tom","id": 1,"age": 10},"2": {"name": "Tim","id": 2,"age": 10},"3": {"name": "Jim","id": 3,"age": 10}}
完结撒花~
来源地址:https://blog.csdn.net/jiuweihu521/article/details/130867637
免责声明:
① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。
② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341