首页 > 编程语言 >java常用的工具类之Collectors.toMap

java常用的工具类之Collectors.toMap

时间:2023-03-20 17:13:04浏览次数:34  
标签:map toMap java name Collectors Person Student new

java.util.stream.Collectors

一.Collectors.toMap

1.构造List

List<Student> list = new ArrayList<>();
for (int i = 1; i < 4; i++) {
   list.add(new Student(i+"","学生"+i));
}

2.将list转成以id为key,value为id对应Sudent对象的map

Map<String, Student> map = list.stream().collect(Collectors.toMap(Student::getId, Function.identity()));

3.假如id存在重复值,则会报错Duplicate key xxx, 解决方案是

// 取原来的值
Map<String, Student> map = list.stream().collect(Collectors.toMap(Student::getId,Function.identity(),(oldValue,newValue) -> newValue));
// 取最新的值
Map<String, Student> map = list.stream().collect(Collectors.toMap(Student::getId,Function.identity(),(oldValue,newValue) -> oldValue));

4.想获得一个id和name对应的Map<String, String>

Map<String, String> map = list.stream().collect(Collectors.toMap(Student::getId,Student::getName)); 
// 注意:name可以为空字符串但不能为null,否则会报空指针,解决方案:
Map<String, String> map = list.stream().collect(Collectors.toMap(Student::getId, e->e.getName()==null?"":e.getName()));
// 假如存在id重复,两个value可以这样映射到同一个id:
Map<String, String> map = list.stream().collect(Collectors.toMap(Student::getId,Student::getName,(e1,e2)->e1+","+e2));

5.把集合按照group属性分组到map中

Map<String, List<Student>> map = list.stream().collect(Collectors.groupingBy(Student::getGroup));
// 输出
map = {
  学生2=[
    CollectorsTest.Student(id=2, name=null, group=学生2),
    CollectorsTest.Student(id=2, name=null, group=学生2)
  ],
  学生1=[CollectorsTest.Student(id=1, name=null, group=学生1)],
  学生3=[CollectorsTest.Student(id=3, name=null, group=学生3)]
}

6.过滤去重,两个List

List<Student> list1 = new ArrayList<>();
List<Student> list2= new ArrayList<>();
HashMap<String, String> hashMap = new HashMap<>();
for (int i = 1; i < 4; i++) {
    list1.add(new Student(i+"","学生"+i));
}
for (int i = 2; i < 5; i++) {
    list2.add(new Student(i+"","学生"+i));
}
// 过滤出list1的key 与 map2相同的key
Stream<Student> studentStream = list1.stream().map(Student::getId).filter(map2::containsKey).map(map2::get);
List<String> strings = list1.stream().map(Student::getId).filter(map2::containsKey).map(map2::get).map(Student::getName).collect(Collectors.toList());

7.返回 Map<String, Map<Integer, Object>>

List<Person> personList = new ArrayList<>();
personList.add(new Person("hepengju", 28, 20000.0));
personList.add(new Person("lisi" , 44, 40000.0));
personList.add(new Person("wangwu" , 55, 50000.0));
personList.add(new Person("zhaoliu" , 66, 60000.0));
personList.add(new Person("zhangsan", 33, 33333.0));
personList.add(new Person("wgr", 23, 10000.0));
Map<String, Map<Integer, Person>> collect = personList.stream().collect(Collectors.toMap(Person::getName, p -> {
    Map<Integer, Person> map = new HashMap<>();
    	map.put(p.getAge(), p);
    	return map;
}));
collect.forEach((name, p) -> {
	System.out.println(name + ":" + p);
});
// 输出
lisi:{44=CollectorsTest.Person(name=lisi, age=44, group=40000.0)}
wgr:{23=CollectorsTest.Person(name=wgr, age=23, group=10000.0)}
zhaoliu:{66=CollectorsTest.Person(name=zhaoliu, age=66, group=60000.0)}
hepengju:{28=CollectorsTest.Person(name=hepengju, age=28, group=20000.0)}
zhangsan:{33=CollectorsTest.Person(name=zhangsan, age=33, group=33333.0)}
wangwu:{55=CollectorsTest.Person(name=wangwu, age=55, group=50000.0)}

标签:map,toMap,java,name,Collectors,Person,Student,new
From: https://www.cnblogs.com/AlwaysStudying/p/17236975.html

相关文章

  • 我可以帮你理解Java方法的传递方式
    你好,这是Bing。我可以帮你理解Java方法的传递方式。......
  • Java HashMap为什么线程不安全
    一、学习目标1、HashMap线程不安全原因:原因:JDK1.7中,由于多线程对HashMap进行扩容,调用了HashMap#transfer(),具体原因:某个线程执行过程中,被挂起,其他线程已经完成数据迁......
  • Java敏捷开发框架 高效搭建数据报表
    随着数字化转型在企业中不断深入推动,对企业的财务领域的转型也带来巨大的冲击。外部市场环境的快速变化,使企业经营者的决策时间从原来的几年和几个月缩短到几周甚至几天,组......
  • java常用的工具类之CollectionUtils
    org.apache.commons.collections4.CollectionUtils1.判断集合是否为空或者不为空//为空CollectionUtils.isEmpty(null):trueCollectionUtils.isEmpty(newArrayList(......
  • JAVA并发
    并发三要素:可见性:一个线程对共享变量的修改,另一个线程能马上看到(CPU缓存引起)原子性:一个操作或者多个操作,要么全部执行并且执行的过程不会被任何因素打断,要么就都不执行。......
  • java方法-定义及调用
    方法的定义及调用定义:Java的方法类似于其它语言的函数,是一段用来完成特定功能的代码片段,一般情况下,定义一个方法包含以下语法:方法包含一个方法头和一个方法体,下面是......
  • java网络编程
    初始网络编程常见浏览器的架构有些比较大型的软件这2种架构都会兼顾2种架构的优缺点比较B/S架构,以网页游戏为例画面烂C/S架构在c/s架构中,安装包中已经有......
  • java-线程之间的协作
      一、线程之间的协作:join()classJoinExample{privateclassAextendsThread{@Overridepublicvoidrun(){System.out.pri......
  • java 根据word xml模板生成word(个人v2版本)
    这里用的是poi相关jar包以及freemarker插值技术实现,poi相关jar包这里不再述说1,编辑word并保存为xml其中需要动态输出的内容使用${xxx}代替,xxx是你的java类属性值,如:年龄:${age......
  • Java线程知识点总结
    文章目录​​Java线程基础​​​​线程简介​​​​什么是进程​​​​什么是线程​​​​进程和线程的区别​​​​创建线程​​​​Thread​​​​Runnable​​​​Calla......