Java8 实现stream将对象集合list中抽取属性集合转化为map或list
首先新建一个实体类Person
@Data public class Person { /** 编码 */ private String code; /** 名字 */ private String name; public Person(String code, String name) { this.code = code; this.name = name; } }
实例化三个对象放入list集合中
public static void main(String[] args) { Person person1 = new Person("001", "张三"); Person person2 = new Person("002", "李四"); Person person3 = new Person("002", "王五"); List<Person> personList = new ArrayList<>(); personList.add(person1); personList.add(person2); personList.add(person3); personList.forEach(t -> System.out.println(t.toString())); }
输出结果为:
Person(code=001, name=张三)
Person(code=002, name=李四)
Person(code=002, name=王五)
1.抽取对象的code作为key,name作为value转化为map集合
方法为
private static HashMap<String, String> listToMap(List<Person> personList) { return (HashMap<String, String>)personList.stream() .filter(t -> t.getName()!=null) .collect(Collectors.toMap(Person::getCode,Person::getName,(k1,k2)->k2)); }
filter() 方法作用是过滤掉名字为空的对象,当对象的名字为null时,会出现NPE空指针异常
(k1,k2)->k2 意思是遇到相同的key时取第二个值
(k1,k2)->k1 意思是遇到相同的key时取第一个值
调用这个方法
HashMap<String,String> personMap = listToMap(personList); personMap.forEach((k,v)-> System.out.println(k.toString() + " - " + v.toString()));
输出结果为:
001 - 张三
002 - 王五
2.抽取对象的name得到name的list集合
方法为
private static List<String> getNameList(List<Person> personList) { return personList.stream().map(Person::getName).collect(Collectors.toList()); }
调用这个方法
List<String> nameList = getNameList(personList); nameList.forEach(t -> System.out.println(t.toString()));
输出结果为:
张三
李四
王五
补充:java8 使用stream将List转成Map,或者从List对象中获取单个属性List,List中根据某个字段排序
1.学生类
import lombok.Data; @Data public class Student{ private String stuId; private String name; private String age; private String sex; }
2.测试类
public class Test { public static void main(String[] args) { // 创建学生List List<Student> list = createStudentList(); // 1.获取value为Student对象,key为学生ID的Map getStudentObjectMap(list); // 2.获取value为学生姓名,key为学生ID的Map getStudentNameMap(list); // 3.获取学生姓名List getStudentNameList(list); //4.List中删除学生id = 1的对象 list.removeIf(student -> student.getStuId().equals(1)); //5.如果StudentId为Long类型如何转? Map<String, String> mapStr = list.stream().collect(Collectors.toMap(student -> student.getStuId().toString(), student -> JSON.toJSONString(student))); //6.根据List中Student的学生姓名排序 Collections.sort(list, (o1, o2) -> { if (o1.getName().compareTo(o2.getName()) > 0) { return 1; } else if (o1.getName().compareTo(o2.getName()) < 0) { return -1; } else { return 0; } }); //7.List遍历 List<String> listStr = new ArrayList<>(); List<Student> listStu = new ArrayList<>(); listStr.forEach(studentStr -> { listStu.add(JSON.parseObject(studentStr, Student.class)); }); //List根据某个字段过滤、排序 listStu.stream() .filter(student -> student.getSex().equals("女")) .sorted(Comparator.comparing(Student::getName)) .collect(Collectors.toList()); //List根据某个字段分组 Map<String,List<Student>> sexGroupMap = listStu.stream() .collect(Collectors.groupingBy(Student::getSex)); //如果Map中多个名称相同,则studentId用逗号间隔 Map<String,String> studentNameIdMap = listStu.stream() .collect(toMap(Student::getName,Student::getStuId,(s,a)->s+","+a)); } public static List<Student> createStudentList() { List<Student> list = new ArrayList<Student>(); Student lily = new Student(); lily.setStuId("1"); lily.setName("lily"); lily.setAge("14"); lily.setSex("女"); Student xiaoming = new Student(); xiaoming.setStuId("2"); xiaoming.setName("xiaoming"); xiaoming.setAge("15"); xiaoming.setSex("男"); list.add(lily); list.add(xiaoming); return list; } public static Map<Object, Object> getStudentObjectMap(List<Student> list) { Map<Object, Object> map = list.stream().collect(Collectors.toMap(Student::getStuId, student -> student)); map.forEach((key, value) -> { System.out.println("key:" + key + ",value:" + value); }); return map; } public static Map<String, String> getStudentNameMap(List<Student> list) { Map<String, String> map = list.stream().collect(Collectors.toMap(Student::getStuId, Student::getName)); map.forEach((key, value) -> { System.out.println("key:" + key + ",value:" + value); }); return map; } public static List<String> getStudentNameList(List<Student> list) { List<String> result = list.stream().map(student -> student.getName()).collect(Collectors.toList()); for (String name : result) { System.out.println("name:" + name); } return result; } }
以上为个人经验,希望能给大家一个参考,也希望大家多多支持猪先飞。如有错误或未考虑完全的地方,望不吝赐教。
相关文章
Java8 实现stream将对象集合list中抽取属性集合转化为map或list
这篇文章主要介绍了Java8 实现stream将对象集合list中抽取属性集合转化为map或list的操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2021-02-05- 这篇文章主要介绍了java8如何用Stream查List对象某属性是否有重复的操作,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教...2021-09-11
java8中的Collectors.groupingBy用法详解
这篇文章主要介绍了java8中的Collectors.groupingBy用法详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2021-03-17- 这篇文章主要介绍了在java中获取List集合中最大的日期时间操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2020-08-15
解决:failed to open stream: No such file or directory in
本教程来给各位同学介绍failed to open stream: No such file or directory in解决办法,有需要了解的朋友可进入参考。 Warning: include_once(./include/main.i...2016-11-25- 这篇文章主要介绍了C#中list用法,结合实例形式分析了C#中list排序、运算、转换等常见操作技巧,具有一定参考借鉴价值,需要的朋友可以参考下...2020-06-25
- 这篇文章主要介绍了Java8处理List的双层循环问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2020-08-19
- 这篇文章主要介绍了C# List 排序各种用法与比较的相关资料,需要的朋友可以参考下...2020-06-25
- 这篇文章主要介绍了使用list stream:任意对象List拼接字符串操作,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教...2021-09-09
浅谈Java8 的foreach跳出循环break/return
这篇文章主要介绍了Java8 的foreach跳出循环break/return,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教...2021-07-28- 这篇文章主要介绍了C# List介绍及具体用法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2020-06-25
- 这篇文章主要介绍了Java List集合返回值去掉中括号('[ ]')的操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2020-08-29
Java 8 Stream 的终极技巧——Collectors 功能与操作方法详解
这篇文章主要介绍了Java 8 Stream Collectors 功能与操作方法,结合实例形式详细分析了Java 8 Stream Collectors 功能、操作方法及相关注意事项,需要的朋友可以参考下...2020-05-20- 这篇文章主要介绍了R语言-将list转换为向量的操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2021-05-06
- 这篇文章主要介绍了Python 列表(List)的底层实现原理分析,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2021-03-09
- 这篇文章主要介绍了Java8 使用流抽取List<T>集合中T的某个属性操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2021-02-05
JavaScript中的数组遍历forEach()与map()方法以及兼容写法介绍
下面小编就为大家带来一篇JavaScript中的数组遍历forEach()与map()方法以及兼容写法介绍。小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧...2016-05-20- 这篇文章主要介绍了c#之FileStream对象读写大文件,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2020-06-25
- map容器是C++ STL中的重要一员,删除map容器中value为指定元素的问题是我们经常与遇到的一个问题,下面这篇文章主要给大家介绍了关于利用C++如何删除map容器中指定值的元素的相关资料,需要的朋友可以参考借鉴,下面来一起看看吧。...2020-04-25
C#中数组、ArrayList、List、Dictionary的用法与区别浅析(存取数据)
在工作中经常遇到C#数组、ArrayList、List、Dictionary存取数据,但是该选择哪种类型进行存储数据呢?很迷茫,今天小编抽空给大家整理下这方面的内容,需要的朋友参考下吧...2020-06-25