首页

通过Stream流的Collectors.toMap将List转Map、map()函数转换成List集合

标签:Stream map     发布时间:2023-01-27   

一、前言

利用java8的新特性stream流进行List或Map的转换操作 - 将List<Map<String,Object>> 和 List<Person>转换为 List<String> 、List转换为Map使用Collectors.toMap方法来进行转换。

二、List转换代码示例

1)List<Map<String,Object>>转换为 List<String>代码 

package com.xwood.demo.java8;@b@@b@import java.util.ArrayList;@b@import java.util.HashMap;@b@import java.util.List;@b@import java.util.Map;@b@import java.util.stream.Collectors;@b@@b@public class MapTest {@b@@b@     public static void main(String[] args) {@b@        //1.@b@        List<Map<String,Object>> mapList = new ArrayList<>();@b@        Map<String,Object> map = new HashMap<>();@b@        map.put("1a","1");@b@        mapList.add(map);@b@        Map<String,Object> map2 = new HashMap<>();@b@        map2.put("1a","1");@b@        map2.put("2a","2");@b@        mapList.add(map2);@b@        Map<String,Object> map3= new HashMap<>();@b@        map3.put("3a","3");@b@        mapList.add(map3);@b@    @b@        List<String> a1List = mapList.stream()@b@                .map(s -> String.valueOf(s.get("1a")))@b@                .collect(Collectors.toList());@b@        System.out.println("示例1:"+a1List);@b@    @b@    @b@        List<String> allList = mapList.stream()@b@                .map(s ->  s.entrySet().iterator().next().getKey())@b@                .collect(Collectors.toList());@b@        System.out.println("示例2:"+allList);@b@    @b@        //3.@b@        List<Person>  persinList=new ArrayList<Person>(3){{@b@            add(new Person("张三",25));@b@            add(new Person("李四",30));@b@            add(new Person("王五",40));@b@        }};@b@        Map<String,Integer>  nameAgeMapping = persinList.stream().collect(Collectors.toMap(Person::getName, Person::getAge));@b@        System.out.println("示例3:"+nameAgeMapping);@b@    @b@    @b@    @b@    }@b@}

运行结果如下

示例1:[1, 1, null]@b@示例2:[1a, 1a, 3a]@b@示例3:{李四=30, 张三=25, 王五=40}

2) 将List<Person>转换为 List<String> 代码

package com.xwood.demo.java8;@b@@b@import com.xwood.demo.optional.User;@b@@b@import java.util.ArrayList;@b@import java.util.List;@b@import java.util.stream.Collectors;@b@@b@public class DtoListTest {@b@@b@    public static void main(String[] args) {@b@        List<Person>  peopleList=new ArrayList<Person>(){{@b@            add(new Person("张三",21));@b@            add(new Person("李四",22));@b@        }};@b@@b@        List<String> strList=peopleList.stream().map(Person::getName).collect(Collectors.toList());@b@        System.out.println(strList);@b@    }@b@@b@@b@}

运行结果

[张三, 李四]

三、Map转换代码示例

在Stream流中将List转换为Map,是使用Collectors.toMap方法来进行转换。

1)key和value都是对象中的某个属性值。

import java.util.List;@b@import java.util.*;@b@import java.util.stream.Collectors;@b@@b@public class MapTest2 { @b@@b@    public static void main(String[] args) {@b@@b@        List<Person>  persinList=new ArrayList<Person>(3){{@b@            add(new Person("张三",25));@b@            add(new Person("李四",30));@b@            add(new Person("王五",40));@b@        }};@b@@b@        Map<Integer, String> persinMap = persinList.stream().collect(Collectors.toMap(Person::getAge, Person::getName));@b@        System.out.println(persinMap.toString());@b@ @b@    } @b@ @b@}

控制台打印结果

{40=王五, 25=张三, 30=李四}

2)使用箭头函数

import com.alibaba.fastjson.JSON; @b@import java.util.List;@b@import java.util.*;@b@import java.util.stream.Collectors;@b@@b@public class MapTest2 {@b@@b@    public static void main(String[] args) {@b@@b@        List<Person>  persinList=new ArrayList<Person>(3){{@b@            add(new Person("张三",25));@b@            add(new Person("李四",30));@b@            add(new Person("王五",40));@b@        }};@b@@b@        Map<Integer, Person> persinMap = persinList.stream().collect(Collectors.toMap(Person::getAge, Person->Person));@b@        //或者写法:Map<Integer, Person> persinMap = persinList.stream().collect(Collectors.toMap(Person::getAge, v -> v, (a, b) -> a));@b@        @b@        System.out.println(JSON.toJSON(persinMap));@b@@b@    }@b@@b@}

控制台打印结果

{"40":{"name":"王五","age":40},"30":{"name":"李四","age":30},"25":{"name":"张三","age":25}}

另外使用Collectors.toMap(Person::getAge, v -> v, (a, b) -> a)方式,代码如下

import com.alibaba.fastjson.JSON;@b@import java.util.List;@b@import java.util.*;@b@import java.util.stream.Collectors;@b@@b@public class MapTest2 {@b@@b@    public static void main(String[] args) {@b@@b@        List<Person>  persinList=new ArrayList<Person>(3){{@b@            add(new Person("张三",25));@b@            add(new Person("李四",30));@b@            add(new Person("王五",40));@b@            add(new Person("张三",25));@b@        }};@b@        //第一个参数Person::getAge 表示选择Person的getAge作为map的key值;@b@        //第二个参数v -> v表示选择将原来的对象作为map的value值;@b@        //第三个参数(v1, v2) -> v1中,如果v1与v2的key值相同,选择v1作为那个key所对应的value值@b@        Map<Integer, Person> persinMap = persinList.stream().collect(Collectors.toMap(Person::getAge, v -> v,  (v1, v2) -> v1));@b@@b@        System.out.println(JSON.toJSON(persinMap));@b@    }@b@@b@}

控制台打印结果

{"40":{"name":"王五","age":40},"30":{"name":"李四","age":30},"25":{"name":"张三","age":25}}

3) 使用Lambda表达式 - key是对象中的某个属性值,value是对象本身(使用Function.identity()的简洁写法)。

import com.alibaba.fastjson.JSON;@b@import java.util.List;@b@import java.util.*;@b@import java.util.function.Function;@b@import java.util.stream.Collectors;@b@@b@public class MapTest2 {@b@@b@    public static void main(String[] args) {@b@@b@        List<Person>  persinList=new ArrayList<Person>(3){{@b@            add(new Person("张三",25));@b@            add(new Person("李四",30));@b@            add(new Person("王五",40));@b@        }};@b@@b@        Map<Integer, Person> persinMap = persinList.stream().collect(Collectors.toMap(Person::getAge, Function.identity()));@b@@b@        System.out.println(JSON.toJSON(persinMap));@b@    }@b@@b@}

控制台打印结果

{"40":{"name":"王五","age":40},"30":{"name":"李四","age":30},"25":{"name":"张三","age":25}}

4) 处理重复的key - key是对象中的某个属性值,value是对象本身,当key冲突时选择第二个key值覆盖第一个key值。

import com.alibaba.fastjson.JSON;@b@import java.util.List;@b@import java.util.*;@b@import java.util.function.Function;@b@import java.util.stream.Collectors;@b@@b@public class MapTest2 {@b@@b@    public static void main(String[] args) {@b@@b@        List<Person>  persinList=new ArrayList<Person>(3){{@b@            add(new Person("张三",25));@b@            add(new Person("李四",30));@b@            add(new Person("王五",40));@b@            add(new Person("张三",25));@b@        }};@b@@b@        Map<Integer, Person> persinMap = persinList.stream().collect(Collectors.toMap(Person::getAge, Function.identity(), (oldValue, newValue) -> newValue));@b@@b@        System.out.println(JSON.toJSON(persinMap));@b@    }@b@@b@}

控制台打印结果

{"40":{"name":"王五","age":40},"30":{"name":"李四","age":30},"25":{"name":"张三","age":25}}
@b@
  • <<相关内容>>
<<热门下载>>