一、前言
利用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@