资讯专栏INFORMATION COLUMN

使代码更简洁(二)----集合转换相关

meislzhua / 1955人阅读

摘要:举个例子,在开发通知中心时需要给用户推送消息,安卓和是调用的不同的第三方库,所以要根据设备的类型调用不同的方法。接着要获得是的列表,是安卓的列表。

博客搬移到这里:http://yemengying.com/
有个自己的博客还蛮好玩的,bazinga!

记录一下在工作开发中封装的一些工具类,使代码看起来更加的简洁。这篇就记录下和集合转换相关的吧。。。。。会持续记录。。。。

list转map

开发过程中经常会碰到需要将list转为map的情况,例如有一个User类,有id,name,age等属性。有一个User的list,为了很方便的获取指定id的User,这时就需要将List< User>转换为Map,其中map的key是User的id。
一般的做法,是通过for循环将list中的元素put到map中,代码如下:

</>复制代码

  1. Map map = new HashMap();
  2. for(User user : userList){
  3. map.put(user.getId(), user);
  4. }

这样做,在每个需要将list转为map的地方,都要写一遍for循环,代码不够简洁,所以利用stream和泛型封装了一个通用的工具方法

</>复制代码

  1. public class TransFormUtils {
  2. /**
  3. * 将list转为map
  4. * @param list
  5. * @param predicate1 key
  6. * @param predicate2 value
  7. * @return
  8. */
  9. public static Map transformToMap(List list,Function predicate1, Function predicate2){
  10. return list.stream().collect(Collectors.toMap(predicate1, predicate2));
  11. }
  12. }

这样如果需要将List< User>转为Map代码如下

</>复制代码

  1. //省略list构造过程
  2. Map map = TransFormUtils.transformToMap(userList, p->p.getId(), p->p);

如果需要将List< User>转为Map代码如下

</>复制代码

  1. //省略list构造过程
  2. Map map2 = TransFormUtils.transformToMap(userList, p->p.getId(), p->p.getName());

应用封装好的工具类 只需要一行代码就可以完成list到map的转换,程序简单了许多~~

list< T >转map< K,List< V>>

将开发中经常需要根据list中的某个属性将list分类。举个例子,在开发通知中心时需要给用户推送消息,安卓和ios是调用的不同的第三方库,所以要根据设备的类型调用不同的方法。首先根据要推送的用户Id列表获得List< DeviceUser>,DeviceUser类的属性包括devicetype,deviceId,userId,userName,createAt等。接着要获得deviceType是ios的deviceId列表,deviceType是安卓的deviceId列表。即将List< DeviceUser>转为Map< Integer,List< String>>,其中map的key是deviceType,value是deviceId的list。
为了解决这个问题,写了一个通用的工具类。
1.利用stream

</>复制代码

  1. public class TransFormUtils {
  2. /**
  3. * 将list转为Map>
  4. * @param list
  5. * @param predicate1 map中的key
  6. * @param predicate2 map中的list的元素
  7. * @return
  8. */
  9. public static Map> transformToMapList(List list, Function predicate1, Function predicate2){
  10. return list.stream().collect(
  11. Collectors.groupingBy(predicate1,
  12. Collectors.mapping(predicate2,
  13. Collectors.toList())));
  14. }
  15. }

使用如下:

</>复制代码

  1. List list = new ArrayList();
  2. //省略list的构造
  3. Map> deviceMap = TransFormUtils.transformToMapList(list, p->p.getDeviceType(), p->p.getDeviceId());

2.普通方法
同事也写了一个另一个工具类,这种方法定义了一个新的数据结构,直接使用MapList代替Map

</>复制代码

  1. /**
  2. * Map&List组合数据结构
  3. *
  4. * @author jianming.zhou
  5. *
  6. * @param
  7. * @param
  8. */
  9. public class MapList {
  10. private Map> map = new HashMap>();
  11. public List get(K k) {
  12. return map.get(k);
  13. }
  14. public void put(K k, V v) {
  15. if (map.containsKey(k)) {
  16. map.get(k).add(v);
  17. } else {
  18. List list = new ArrayList();
  19. list.add(v);
  20. map.put(k, list);
  21. }
  22. }
  23. public Set keySet() {
  24. return map.keySet();
  25. }
  26. }

使用如下

</>复制代码

  1. List list = new ArrayList();
  2. //省略list的构造
  3. MapList> deviceMap = new MapList>();
  4. for(DeviceUser device : list){
  5. deviceMap.put(device.getDeviceType(),device.getDeviceId());
  6. }

还是喜欢第一种哈哈哈哈哈哈~~
题外话:既然对现状不满意 就尝试改变吧 虽然有可能进入另一个坑~~

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/64512.html

相关文章

  • 使代码简洁(一)---List相关

    摘要:就如同一个迭代器,单向,不可往复,数据只能遍历一次,遍历过一次后即用尽了,就好比流水从面前流过,一去不复返。而和迭代器又不同的是,可以并行化操作,迭代器只能命令式地串行化操作。 博客搬移到这里:http://yemengying.com/有个自己的博客还蛮好玩的,bazinga! 记录一下在工作开发中封装的一些工具类,使代码看起来更加的简洁。这篇就记录下和list相关的吧。。。。。会持...

    lpjustdoit 评论0 收藏0
  • JavaScript中的函数式编程(翻译)

    摘要:原文链接原文作者函数式编程这篇文章是介绍函数式编程的四篇文章中的第二篇。这些部分被使用的越来越频繁,人们把他们放到一个函数式编程的库里面,有一些流行的库包括未亡待续阅读下一节原文地址欢迎关注 showImg(https://segmentfault.com/img/bVtSez); tips 原文链接: http://jrsinclair.com/articles/2016/gentl...

    smartlion 评论0 收藏0
  • Java 8 vs. Scala():Stream vs. Collection

    摘要:比如对一个数据流进行过滤映射以及求和运算,通过使用延后机制,那么所有操作只要遍历一次,从而减少中间调用。这里需知道中的元素都是延迟计算的,正因为此,能够计算无限数据流。 【编者按】在之前文章中,我们介绍了 Java 8和Scala的Lambda表达式对比。在本文,将进行 Hussachai Puripunpinyo Java 和 Scala 对比三部曲的第二部分,主要关注 Stream...

    GeekGhc 评论0 收藏0
  • JavaWEB开发14——ajax

    摘要:一概述什么是同步,什么是异步同步现象客户端发送请求到服务器端,当服务器返回响应之前,客户端都处于等待卡死状态异步现象客户端发送请求到服务器端,无论服务器是否返回响应,客户端都可以随意做其他事情,不会被卡死的运行原理页面发起请求,会将请求发送 一、Ajax概述1.什么是同步,什么是异步同步现象:客户端发送请求到服务器端,当服务器返回响应之前,客户端都处于等待 卡死状态异步现象:客户...

    yearsj 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<