Java8 lamda整合两个集合list为统一集合

lamda整合两个集合list为统一集合

  • 阐述问题
  • 代码
  • 总结
  • 补充解决方案:

阐述问题

在使用PageHelper分页工具时,出现统计total异常,或者分页的其他参数有问题,网上有了不少帖子,要么查两次,要么写好mybatis映射。当然mybatis映射我一开始就写好了不起作用。最终还是查两次数据库。
Java8 lamda整合两个集合list为统一集合_第1张图片
Java8 lamda整合两个集合list为统一集合_第2张图片

代码

第一次是在获取page前就查好想要的,然后再查询单表,对应一致就好

//3、查询-PageHelper带有子集的SQL查询总数映射有问题
//3-1 获取全部用户以及角色
List<SysUser> list1 = sysUserService.getAllUserByConditions(departNames,userName,realName,jobNumber);
PageHelper.startPage(pageNum, pageSize);
List<SysUser> list = sysUserService.getAllUserToPageHelper(departNames,userName,realName,jobNumber);
//3-2 将单表获取的与带角色的匹配,在转移过来
//法一:将list1 中对应的直接全部转为新list覆盖原list
list = list.stream().map(mapper->
	list1.stream()
	.filter(predicate-> predicate.getUserId() == mapper.getUserId())
	.findFirst().orElse(null)
).collect(Collectors.toList());
//法二:将list1 中对应的role集合复制到list的role空集合中
list.forEach(action->{action.setRoles(
	list1.stream()
	.filter(user-> user.getUserId() == action.getUserId())
	.map(user -> user.getRoles()).findFirst().get()
);});
PageInfo<SysUser> pageInfo = new PageInfo<SysUser>(list);
//3-3 总是仍要为全部的,配置后的只显示当前页的条数
pageInfo.setTotal(list1.size());

两种方法,第一种就是讲第二个list中的对象全部转化为第一个list中的数据,第二种是只将对应的数据赋值到对应的数据中,都可以实现,看你心情。
注:

  1. PageInfo中的总数依旧有问题,只有当前页数据的总数,显然是不对的,还需在单独修改一下。

总结

  1. 这样写毕竟不是在根源解决,PageHelper没有去研究,有哪位大神知道的可以交流一下。
  2. 还有对于lamda的使用还是不是很熟练,总感觉会有更好的方式,毕竟这样和两次for循环没啥区别,只是代码简洁一些而已。

补充解决方案:

重写page对象:

/**
	 * 分页处理
	 * 目前 前端已处理跳转页超出范围问题,此处不再处理
	 * @param  泛型对象
	 * @param pageNum 当前页码
	 * @param pageSize 每页显示条数
	 * @param list 全部数据集
	 * @return
	 */
	public static <T> PageInfo<T> getPageInfo(int pageNum, int pageSize,List<T> list) {
		//1、创建Page类
		Page<T> page = new Page<T>(pageNum, pageSize);
		//2、为Page类中的total属性赋值
		int total = list.size();
		page.setTotal(total);
		//3、计算当前需要显示的数据下标起始值
		int startIndex = (pageNum - 1) * pageSize;
		int endIndex = Math.min(startIndex + pageSize,total);
		//4、从链表中截取需要显示的子链表,并加入到Page
		if (total > startIndex) {
			page.addAll(list.subList(startIndex,endIndex));
		}else {
			page.addAll(list);
		}
		//5、以Page创建PageInfo
		PageInfo<T> pageInfo = new PageInfo<T>(page);
		return pageInfo;
	}
PageInfo<SysUser> pageInfo = PagehelperUtil.getPageInfo(pageNum, pageSize, list);

你可能感兴趣的:(java,PageHelper,java,mybatis)