Java中List使用stream流转成map的几种方式

本文介绍了如何在Java中将List<Person>转换为Map<String,Object>、Map<String,String>、Map<String,List<Person>>以及Map<String,Map<String,String>>的不同实例,包括使用流API和合并策略的示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

实体例子

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

public class Person {

    private String name;

    private String address;

    public Person(String name, String address) {

        this.name = name;

        this.address = address;

    }

    public String getName() {

        return name;

    }

    public void setName(String name) {

        this.name = name;

    }

    public String getAddress() {

        return address;

    }

    public void setAddress(String address) {

        this.address = address;

    }

}

List 转成Map<String,Object>

1

2

3

4

5

6

7

8

9

10

11

List<Person> list = new ArrayList<>();

Person person1 = new Person("熊大","森林第一个小屋");

Person person2 = new Person("熊二","森林第二个小屋");

Person person3 = new Person("光头强","森林第三个小屋");

Person person4 = new Person("熊大","森林第四个小屋");

list.add(person1);

list.add(person2);

list.add(person3);

list.add(person4);

Map<String,Person> map =  list.stream().collect(Collectors.toMap(Person::getName,each->each,(value1, value2) -> value1));

System.out.println(JSON.toJSONString(map));

控制台打印日志:

{“光头强”:{“address”:“森林第三个小屋”,“name”:“光头强”},“熊大”:{“address”:“森林第一个小屋”,“name”:“熊大”},“熊二”:{“address”:“森林第二个小屋”,“name”:“熊二”}}

List 转成Map<String,String>

1

2

3

4

5

6

7

8

9

10

11

List<Person> list = new ArrayList<>();

Person person1 = new Person("熊大","森林第一个小屋");

Person person2 = new Person("熊二","森林第二个小屋");

Person person3 = new Person("光头强","森林第三个小屋");

Person person4 = new Person("熊大","森林第四个小屋");

list.add(person1);

list.add(person2);

list.add(person3);

list.add(person4);

Map<String,String> map =  list.stream().collect(Collectors.toMap(Person::getName,Person::getAddress,(value1, value2) -> value1));

System.out.println(JSON.toJSONString(map));

控制台打印日志:

{“光头强”:“森林第三个小屋”,“熊大”:“森林第一个小屋”,“熊二”:“森林第二个小屋”}

List 转成Map<String,List>

方法一:

1

2

3

4

5

6

7

8

9

10

11

List<Person> list = new ArrayList<>();

Person person1 = new Person("熊大","森林第一个小屋");

Person person2 = new Person("熊二","森林第二个小屋");

Person person3 = new Person("光头强","森林第三个小屋");

Person person4 = new Person("熊大","森林第四个小屋");

list.add(person1);

list.add(person2);

list.add(person3);

list.add(person4);

Map<String, List<Person>> map = list.stream().collect(Collectors.groupingBy(Person::getName));

System.out.println(JSON.toJSONString(map));

控制台打印日志:

{“光头强”:[{“address”:“森林第三个小屋”,“name”:“光头强”}],“熊大”:[{“address”:“森林第一个小屋”,“name”:“熊大”},{“address”:“森林第四个小屋”,“name”:“熊大”}],“熊二”:[{“address”:“森林第二个小屋”,“name”:“熊二”}]}

方法二:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

List<Person> list = new ArrayList<>();

Person person1 = new Person("熊大","森林第一个小屋");

Person person2 = new Person("熊二","森林第二个小屋");

Person person3 = new Person("光头强","森林第三个小屋");

Person person4 = new Person("熊大","森林第四个小屋");

list.add(person1);

list.add(person2);

list.add(person3);

list.add(person4);

Map<String,List<Person>> map =  list.stream().collect(Collectors.toMap(Person::getName,each->Collections.singletonList(each),(value1, value2) -> {

        List<Person> union = new ArrayList<>(value1);

        union.addAll(value2);

        return union;

    }));

System.out.println(JSON.toJSONString(map));

控制台打印日志:

{“光头强”:[{“address”:“森林第三个小屋”,“name”:“光头强”}],“熊大”:[{“address”:“森林第一个小屋”,“name”:“熊大”},{“address”:“森林第四个小屋”,“name”:“熊大”}],“熊二”:[{“address”:“森林第二个小屋”,“name”:“熊二”}]}

List 转成Map<String,List>

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

List<Person> list = new ArrayList<>();

Person person1 = new Person("熊大","森林第一个小屋");

Person person2 = new Person("熊二","森林第二个小屋");

Person person3 = new Person("光头强","森林第三个小屋");

Person person4 = new Person("熊大","森林第四个小屋");

list.add(person1);

list.add(person2);

list.add(person3);

list.add(person4);

Map<String,List<String>> map = list.stream().collect(Collectors.toMap(Person::getName,each->Collections.singletonList(each.getAddress()),(value1, value2) -> {

        List<String> union = new ArrayList<>(value1);

        union.addAll(value2);

        return union;

    }));

System.out.println(JSON.toJSONString(map));

控制台打印日志:

{“光头强”:[“森林第三个小屋”],“熊大”:[“森林第一个小屋”,“森林第四个小屋”],“熊二”:[“森林第二个小屋”]}

List<Map<String,Object>> 转成Map<String,Map<String,Object>>

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

List<Map<String,Object>> list = new ArrayList<>();

Person person1 = new Person("熊大","森林第一个小屋");

Person person2 = new Person("熊二","森林第二个小屋");

Person person3 = new Person("光头强","森林第三个小屋");

Map<String,Object> map1 = new HashMap<>();

map1.put("id","1");

map1.put("person",person1);

Map<String,Object> map2 = new HashMap<>();

map2.put("id","2");

map2.put("person",person2);

Map<String,Object> map3 = new HashMap<>();

map3.put("id","3");

map3.put("person",person3);

list.add(map1);

list.add(map2);

list.add(map3);

Map<String,Map<String,Object>> map = list.stream().collect(Collectors.toMap(each->Objects.toString(each.get("id"),""),each->each,(key1,key2)->key1));

System.out.println(JSON.toJSONString(map));

控制台打印日志:

{“1”:{“person”:{“address”:“森林第一个小屋”,“name”:“熊大”},“id”:“1”},“2”:{“person”:{“address”:“森林第二个小屋”,“name”:“熊二”},“id”:“2”},“3”:{“person”:{“address”:“森林第三个小屋”,“name”:“光头强”},“id”:“3”}}

List<Map<String,Object>> 转成Map<String,Object>

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

List<Map<String,Object>> list = new ArrayList<>();

Person person1 = new Person("熊大","森林第一个小屋");

Person person2 = new Person("熊二","森林第二个小屋");

Person person3 = new Person("光头强","森林第三个小屋");

Map<String,Object> map1 = new HashMap<>();

map1.put("id","1");

map1.put("person",person1);

Map<String,Object> map2 = new HashMap<>();

map2.put("id","2");

map2.put("person",person2);

Map<String,Object> map3 = new HashMap<>();

map3.put("id","3");

map3.put("person",person3);

list.add(map1);

list.add(map2);

list.add(map3);

Map<String,Object> map = list.stream().collect(Collectors.toMap(each->Objects.toString(each.get("id"),""),each->each.get("person"),(key1,key2)->key1));

System.out.println(JSON.toJSONString(map));

控制台打印日志:

{“1”:{“address”:“森林第一个小屋”,“name”:“熊大”},“2”:{“address”:“森林第二个小屋”,“name”:“熊二”},“3”:{“address”:“森林第三个小屋”,“name”:“光头强”}}

List<Map<String,String>> 转成Map<String,Map<String,String>>

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

List<Map<String,String>> list = new ArrayList<>();

Map<String,String> map1 = new HashMap<>();

map1.put("id","1");

map1.put("name","熊大");

map1.put("address","森林第一个小屋");

Map<String,String> map2 = new HashMap<>();

map2.put("id","2");

map2.put("name","熊二");

map2.put("address","森林第二个小屋");

Map<String,String> map3 = new HashMap<>();

map3.put("id","3");

map3.put("name","光头强");

map3.put("address","森林第三个小屋");

list.add(map1);

list.add(map2);

list.add(map3);

Map<String,Map<String,String>> map = list.stream().collect(Collectors.toMap(each->each.get("id"),each->each,(key1,key2)->key1));

System.out.println(JSON.toJSONString(map));

控制台打印日志:

{“1”:{“address”:“森林第一个小屋”,“name”:“熊大”,“id”:“1”},“2”:{“address”:“森林第二个小屋”,“name”:“熊二”,“id”:“2”},“3”:{“address”:“森林第三个小屋”,“name”:“光头强”,“id”:“3”}}

List<Map<String,String>> 转成Map<String,String>

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

List<Map<String,String>> list = new ArrayList<>();

Map<String,String> map1 = new HashMap<>();

map1.put("id","1");

map1.put("name","熊大");

map1.put("address","森林第一个小屋");

Map<String,String> map2 = new HashMap<>();

map2.put("id","2");

map2.put("name","熊二");

map2.put("address","森林第二个小屋");

Map<String,String> map3 = new HashMap<>();

map3.put("id","3");

map3.put("name","光头强");

map3.put("address","森林第三个小屋");

list.add(map1);

list.add(map2);

list.add(map3);

Map<String,String> map = list.stream().collect(Collectors.toMap(each->each.get("id"),each->each.get("name"),(key1,key2)->key1));

System.out.println(JSON.toJSONString(map));

控制台打印日志:

{“1”:“熊大”,“2”:“熊二”,“3”:“光头强”}

### 将 Java Stream 中的 List 换为 Map 并从另一个 Map 获取值 在 Java 8 的 `Stream` API 中,可以利用 `Collectors.toMap()` 方法将一个 `List` 换为 `Map`。此方法允许指定键和值的映射逻辑[^1]。为了实现从另一个现有的 `Map` 中获取目标 `Map` 的值,可以通过函数式接口传递逻辑来完这一需求。 以下是具体实现: #### 实现代码 假设有一个 `List<String>` 和一个已存在的 `Map<String, Integer>`,我们希望基于列表中的元素创建一个新的 `Map`,其中新 `Map` 的值来源于已有 `Map`。 ```java import java.util.*; import java.util.stream.Collectors; public class Main { public static void main(String[] args) { // 已有数据结构 List<String> keys = Arrays.asList("a", "b", "c"); Map<String, Integer> existingMap = new HashMap<>(); existingMap.put("a", 1); existingMap.put("b", 2); existingMap.put("c", 3); // 使用 StreamList 换为 Map,并从现有 Map 获取值 Map<String, Integer> resultMap = keys.stream() .filter(existingMap::containsKey) // 过滤掉不存在于 existingMap 的 key .collect(Collectors.toMap( Function.identity(), // 键保持不变 existingMap::get // 值来自 existingMap )); System.out.println(resultMap); // 输出 {a=1, b=2, c=3} } } ``` #### 解析 上述代码中: - `.stream()` 将 `List` 化为流。 - `.filter(existingMap::containsKey)` 确保只保留存在于 `existingMap` 中的键。 - `Collectors.toMap(Function.identity(), existingMap::get)` 定义了如何构建新的 `Map`,其中键保持原样 (`Function.identity()`),而值则通过调用 `existingMap.get(key)` 来设置[^3]。 这种方法充分利用了 `Stream` 的链式操作能力以及 `Collectors.toMap()` 提供的强大功能。 --- #### 注意事项 如果存在重复键的情况,默认会抛出异常。为了避免这种情况,可以在 `toMap` 方法中提供第三个参数作为解决冲突的合并策略。例如: ```java .collect(Collectors.toMap( Function.identity(), existingMap::get, (value1, value2) -> value1 + value2)); // 合并两个值 ``` 这表示当遇到重复键时,将对应的值相加。 --- #### 性能考虑 对于大规模数据集,应评估性能影响。虽然 `Stream` 是一种优雅的方式处理集合,但在高并发场景下可能需要结合其他工具(如 `ConcurrentHashMap`),以确保线程安全[^2]。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值