当前位置: 首页 > 后端技术 > Java

实用技巧19:ListtoMapList的几种姿势

时间:2023-04-02 10:19:57 Java

今天介绍一个实用的小知识点,如何将List转为Map>1。基本的写法当然是一开始最常用最直观的写法。也是一种写任何限制的方式//比如下面的列表按照字符串的长度分组Listlist=newArrayList<>();list.add("hello");list.add(“单词”);list.add("come");list.add("on");Map>ans=newHashMap<>();for(Stringstr:list){Listsub=ans.get(str.length());if(sub==null){sub=newArrayList<>();ans.put(str.length(),sub);}sub.add(str);}System.out.println(ans);对于jdk8+,上面for循环中的内容可以换成Map.computeIfAbsent,具体写法如下.add(str);}当然,由于已经是jdk1.8了,借助Stream的流处理,可以简化上面的步骤,如下Map>ans=list.stream().collect(Collectors.groupingBy(String::length));2.通用方法上面是针对具体的列表和业务开发转换,那么我们这里就尝试搭建一个通用的工具类我们主要用到的知识点是泛型,一个重要的点是如何获取Map中的key。对于jdk<1.8,通过接口publicstaticMap>toMapList(Listlist,KeyFunckeyFunc){Map>result=newHashMap<>();for(Vitem:list){Kkey=keyFunc.getKey(item);if(!result.containsKey(key)){result.put(key,newArrayList<>());}result.get(key).add(item);}returnresult;}publicstaticinterfaceKeyFunc{KgetKey(Tt);}使用demo如下publicstaticvoidmain(String[]args){Listlist=newArrayList<>();list.add("你好");list.add("单词");list.add("来");list.add("开");Map>res=toMapList(list,newKeyFunc(){@OverridepublicIntegergetKey(Strings){returns.length();}});系统输出原理tln(res);}接下来看下jdk1.8之后的写法,结合流+函数的方式实现publicstaticMap>toMapList(Listlist,Functionfunc){returnlist.stream().collect(Collectors.groupingBy(func));}对应用法如下publicstaticvoidmain(String[]args){Listlist=新数组列表<>();list.add("你好");list.add("单词");list.add("来吧");list.add("开");Map>res=toMapList(list,(Function)String::length);System.out.println(res);}工具类上一节介绍了基于泛型+jdk8Stream+函数方法的实现通用转换工具类的实现姿势。接下来总结输出一个适合1.8及以后版本的工具类。/***List转换为Map>。List,列表中的元素为原列表中的元素**@paramlist*@paramfunc基于list生成Map.key的函数方法#item*@param*@param*@return*/publicstaticMap>toMapList(Listlist,Function<V,K>func){returnlist.stream().collect(Collectors.groupingBy(func));}/***List转换为Map>的特点在于inMap的值为list,list中的元素由list.item转换**@paramlist*@paramkeyFunc基于list生成的Map.key的函数方法#item*@paramvalFuncConvertsMapbasedon项目清单。值列表中元素的函数方法*@param*@param*@param*@return*/publicstaticMap>toMapList(Listlist,FunctionkeyFunc,FunctionvalFunc){返回列表。溪流()。收集(Collectors.groupingBy(keyFunc,Collectors.mapping(valFunc,Collectors.toList())));}4。GuavaHashMultimap扩展知识点最后介绍一个扩展知识点。Gauva工具包提供了一个HashMultimap工具类。它的使用姿势和我们常用的Map没什么区别,但是需要注意的是,它的值是一个集合Listlist=newArrayList<>();list.add("hello");list.add("word");list.add("come");list.add("on");list.add("on");HashMultimapmap=HashMultimap.create();for(Stringitem:strList){map.put(item.length(),item);}System.out.println(map);实际输出如下,验证value其实是一个集合(on只有一个,如果是上面的工具类,会输出两个){2=[on],4=[word,come],5=[你好]}一个灰色的联系方式,不如没有书,以上内容纯属个人意见。由于个人能力有限,难免会有疏漏和错误。如果大家发现bug或者有更好的建议,欢迎大家批评指正。感谢我的个人网站:https://blog.hhui.topWei博客地址:Xiaohuihui博客QQ:Yihuihui/3302797840微信公众号:Yihuihui博客