jdk8 Stream流中将集合转成map,重复key处理,统计最大值,获取某个属性集合等10种最常用方法

简介: jdk8 Stream流中将集合转成map,重复key处理,统计最大值,获取某个属性集合等10种最常用方法

jdk8 Stream流中将集合转成map,重复key处理,统计最大值,获取某个属性集合等10种最常用方法

jdk8 Stream流中将集合转成map,重复key处理,统计最大值,获取某个属性集合等10种最常用方法🔊stream10种常用方法🧣最后的话

🔊stream10种常用方法

//1、list转map,指定key-value,key,value是对象中的某个属性值.

Map<String,String>userMap1=userList.stream().collect(Collectors.toMap(User::getId,User::getName));

System.out.println("1->"+userMap1);

//2、list转map 指定key-value,key为属性值,value是对象本身

Map<String,User>userMap2=userList.stream().collect(Collectors.toMap(User::getId,User->User));

System.out.println("2->"+userMap2);

//3、list转map 指定key-value,value是对象本身,Function.identity()是简洁写法,返回对象本身

Map<String,User>userMap3=userList.stream().collect(Collectors.toMap(User::getId, Function.identity()));

System.out.println("3->"+userMap3);

//4、指定key-value,value是对象本身,Function.identity()是简洁写法,返回对象本身,遇到key 冲突的解决办法,选择第二个key的值value2覆盖第一个key的值value1。

Map<String,User>userMap4=userList.stream().collect(Collectors.toMap(User::getName, Function.identity(),(value1,value2)->value2));

System.out.println("4->"+userMap4);

//5、指定key-value,按照name进行分组 value是对象集合

Map<String, List<User>>userMap5=userList.stream().collect(Collectors.groupingBy(User::getName));

System.out.println("5->"+userMap5);

//6.统计所有age

IntegertotalAge=userList.stream().map(User::getAge).reduce(0, Integer::sum);

System.out.println("6总年龄->"+totalAge);

//7.只对名称为zhangsan的age  进行统计汇总

IntegertotalAgeFilter=userList.stream().filter(t->t.getName().equals("zhangsan")).map(User::getAge).reduce(0, Integer::sum);

System.out.println("7总年龄filter->"+totalAgeFilter);

//8.获取最大age

IntegermaxAge=userList.stream().map(User::getAge).max((x, y) ->x-y).get();

System.out.println("8最大年龄->"+maxAge);

//9.循环打印

userList.stream().forEach(user->System.out.println("9->"+user));

//10.获取名称集合

List<String>nameList=userList.stream().map(User::getName).collect(Collectors.toList());

System.out.println("10名称集合->"+JSON.toJSONString(nameList));

/**

* @author gzh -》javaNice

* 用户类

*/

publicclassUser {

   /**

    * id

    */

   privateStringid;

   /**

    * 名称

    */

   privateStringname;

   /**

    * 年龄

    */

   privateIntegerage;

   publicStringgetId() {

       returnid;

   }

   publicvoidsetId(Stringid) {

       this.id=id;

   }

   publicStringgetName() {

       returnname;

   }

   publicvoidsetName(Stringname) {

       this.name=name;

   }

   publicIntegergetAge() {

       returnage;

   }

   publicvoidsetAge(Integerage) {

       this.age=age;

   }

   @Override

   publicStringtoString() {

       return"User{"+

               "id='"+id+'\''+

               ", name='"+name+'\''+

               ", age="+age+

               '}';

   }

   publicUser() {

   }

   publicUser(Stringid, Stringname, Integerage) {

       this.id=id;

       this.name=name;

       this.age=age;

   }

}

importcom.alibaba.fastjson.JSON;

importorg.assertj.core.util.Lists;

importjava.util.List;

importjava.util.Map;

importjava.util.function.Function;

importjava.util.stream.Collectors;

/**

* @author gzh -》javaNice

* *

*/

publicclassStreamDemo {

   publicstaticvoidmain(String[] args) {

       Useruser1=newUser("1","zhangsan",1);

       Useruser2=newUser("2","zhangsan",2);

       Useruser3=newUser("3","lisi",2);

       List<User>userList=Lists.newArrayList();

       userList.add(user1);

       userList.add(user2);

       userList.add(user3);

       //1、list转map,指定key-value,key,value是对象中的某个属性值.

       Map<String,String>userMap1=userList.stream().collect(Collectors.toMap(User::getId,User::getName));

       System.out.println("1->"+userMap1);

       //2、list转map 指定key-value,key为属性值,value是对象本身

       Map<String,User>userMap2=userList.stream().collect(Collectors.toMap(User::getId,User->User));

       System.out.println("2->"+userMap2);

       //3、list转map 指定key-value,value是对象本身,Function.identity()是简洁写法,返回对象本身

       Map<String,User>userMap3=userList.stream().collect(Collectors.toMap(User::getId, Function.identity()));

       System.out.println("3->"+userMap3);

       //4、指定key-value,value是对象本身,Function.identity()是简洁写法,返回对象本身,遇到key 冲突的解决办法,选择第二个key的值value2覆盖第一个key的值value1。

       Map<String,User>userMap4=userList.stream().collect(Collectors.toMap(User::getName, Function.identity(),(value1,value2)->value2));

       System.out.println("4->"+userMap4);

       //5、指定key-value,按照name进行分组 value是对象集合

       Map<String, List<User>>userMap5=userList.stream().collect(Collectors.groupingBy(User::getName));

       System.out.println("5->"+userMap5);

       //6.统计所有age

       IntegertotalAge=userList.stream().map(User::getAge).reduce(0, Integer::sum);

       System.out.println("6总年龄->"+totalAge);

       //7.只对名称为zhangsan的age  进行统计汇总

       IntegertotalAgeFilter=userList.stream().filter(t->t.getName().equals("zhangsan")).map(User::getAge).reduce(0, Integer::sum);

       System.out.println("7总年龄filter->"+totalAgeFilter);

       //8.获取最大age

       IntegermaxAge=userList.stream().map(User::getAge).max((x, y) ->x-y).get();

       System.out.println("8最大年龄->"+maxAge);

       //9.循环打印

       userList.stream().forEach(user->System.out.println("9->"+user));

       //10.获取名称集合

       List<String>nameList=userList.stream().map(User::getName).collect(Collectors.toList());

       System.out.println("10名称集合->"+JSON.toJSONString(nameList));

   }

}

🧣最后的话

🖲要熟练掌握技巧,一定多多练习:纸上得来终觉浅,绝知此事要躬行


相关实践学习
深入解析Docker容器化技术
Docker是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux机器上,也可以实现虚拟化,容器是完全使用沙箱机制,相互之间不会有任何接口。Docker是世界领先的软件容器平台。开发人员利用Docker可以消除协作编码时“在我的机器上可正常工作”的问题。运维人员利用Docker可以在隔离容器中并行运行和管理应用,获得更好的计算密度。企业利用Docker可以构建敏捷的软件交付管道,以更快的速度、更高的安全性和可靠的信誉为Linux和Windows Server应用发布新功能。 在本套课程中,我们将全面的讲解Docker技术栈,从环境安装到容器、镜像操作以及生产环境如何部署开发的微服务应用。本课程由黑马程序员提供。 &nbsp; &nbsp; 相关的阿里云产品:容器服务 ACK 容器服务 Kubernetes 版(简称 ACK)提供高性能可伸缩的容器应用管理能力,支持企业级容器化应用的全生命周期管理。整合阿里云虚拟化、存储、网络和安全能力,打造云端最佳容器化应用运行环境。 了解产品详情: https://www.aliyun.com/product/kubernetes
目录
相关文章
|
存储 JavaScript 前端开发
js中map属性
js中map属性
176 1
|
8月前
|
安全 Java API
【Java性能优化】Map.merge()方法:告别繁琐判空,3行代码搞定统计累加!
在日常开发中,我们经常需要对Map中的值进行累加统计。}else{代码冗长,重复调用get()方法需要显式处理null值非原子操作,多线程下不安全今天要介绍的方法,可以让你用一行代码优雅解决所有这些问题!方法的基本用法和优势与传统写法的对比分析多线程安全版本的实现Stream API的终极优化方案底层实现原理和性能优化建议一句话总结是Java 8为我们提供的Map操作利器,能让你的统计代码更简洁、更安全、更高效!// 合并两个列表});简单累加。
840 0
|
JavaScript
DOM 属性列表(命名节点图 Named Node Map)
`DOM`中的`Named Node Map`是元素节点属性的列表,自动更新增删操作。代码示例载入&quot;books.xml&quot;,获取第一个`&lt;book&gt;`元素的属性列表,`x.length`显示属性数量,`x.getNamedItem(&quot;category&quot;).nodeValue`输出&quot;category&quot;属性值,如&quot;cooking&quot;,并显示属性总数1。
|
存储 Java API
Java交换map的key和value值
通过本文介绍的几种方法,可以在Java中实现Map键值对的交换。每种方法都有其优缺点,具体选择哪种方法应根据实际需求和场景决定。对于简单的键值对交换,可以使用简单遍历法或Java 8的Stream API;对于需要处理值不唯一的情况,可以使用集合存储或Guava的Multimap。希望本文对您理解和实现Java中的Map键值对交换有所帮助。
347 1
|
Java C# Swift
Java Stream中peek和map不为人知的秘密
本文通过一个Java Stream中的示例,探讨了`peek`方法在流式处理中的应用及其潜在问题。首先介绍了`peek`的基本定义与使用,并通过代码展示了其如何在流中对每个元素进行操作而不返回结果。接着讨论了`peek`作为中间操作的懒执行特性,强调了如果没有终端操作则不会执行的问题。文章指出,在某些情况下使用`peek`可能比`map`更简洁,但也需注意其懒执行带来的影响。
731 2
Java Stream中peek和map不为人知的秘密
|
API
JDK8的stream有求和方法吗?
【8月更文挑战第20天】JDK8的stream有求和方法吗?
420 3
|
存储 JavaScript 前端开发
js中map属性
js中map属性
312 0
|
存储 Java API
探讨Java中交换Map的Key和Value值的技术
探讨Java中交换Map的Key和Value值的技术
324 2
|
存储 算法 Java
Stream很好,Map很酷,但答应我别滥用toMap()!
【8月更文挑战第27天】在Java的世界里,Stream API和Map数据结构无疑是现代编程中的两大瑰宝。Stream API以其函数式编程的优雅和强大的数据处理能力,让集合操作变得简洁而高效;而Map则以其键值对的存储方式,为数据的快速检索和更新提供了便利。然而,当这两者相遇,特别是当我们试图通过Stream的toMap()方法将流中的元素转换为Map时,一些潜在的问题和陷阱便悄然浮现。今天,我们就来深入探讨一下这个话题,并探讨如何更加安全、高效地利用这些强大的工具。
262 0
|
存储 Java
构造String问题之在JDK 9及更高版本中,直接访问String对象的coder和value属性,如何实现
构造String问题之在JDK 9及更高版本中,直接访问String对象的coder和value属性,如何实现
204 0