目录
如果有多重循环的话,数据量较大的话,会消耗CPU资源及代码执行效率。
一、事例对象创建:
List<SysRole> roleList = new ArrayList();
for (int i = 0; i < 800; i++) {
SysRole sysRole = new SysRole();
sysRole.setId(String.valueOf(i));
sysRole.setRoleName("张三" + i);
roleList.add(sysRole);
}
List<SysUserRole> userRoleList = new ArrayList();
for (int j = 0; j < 800; j++) {
SysUserRole sysUserRole = new SysUserRole();
sysUserRole.setUserId(Long.valueOf(j));
sysUserRole.setRoleId(Long.valueOf(j));
userRoleList.add(sysUserRole);
}
二、反例:
for (SysRole role : roleList) {
for (SysUserRole userRole : userRoleList) {
if(role.getId().equals(String.valueOf(userRole.getRoleId()))){
System.out.println(role.getRoleName());
}
}
}
三、正例:
Map<String, List<SysRole>> roleMap = roleList.stream().collect(Collectors.groupingBy(SysRole::getId));
for (SysUserRole userRole : userRoleList) {
List<SysRole> sysRoles = roleMap.get(String.valueOf(userRole.getRoleId()));
if(CollectionUtils.isNotEmpty(sysRoles)){
String roleName = sysRoles.get(0).getRoleName();
System.out.println(roleName);
}
}
四、结果:
1、数据量 < 800时,双重循环快。
2、数据量 > 800时,优化后方法快。
五、完整代码:
public static void main(String[] args) {
List<SysRole> roleList = new ArrayList();
for (int i = 0; i < 800; i++) {
SysRole sysRole = new SysRole();
sysRole.setId(String.valueOf(i));
sysRole.setRoleName("张三" + i);
roleList.add(sysRole);
}
List<SysUserRole> userRoleList = new ArrayList();
for (int j = 0; j < 800; j++) {
SysUserRole sysUserRole = new SysUserRole();
sysUserRole.setUserId(Long.valueOf(j));
sysUserRole.setRoleId(Long.valueOf(j));
userRoleList.add(sysUserRole);
}
StopWatch stopWatch = new StopWatch();
stopWatch.start();
for (SysRole role : roleList) {
for (SysUserRole userRole : userRoleList) {
if(role.getId().equals(String.valueOf(userRole.getRoleId()))){
// System.out.println(role.getRoleName());
}
}
}
stopWatch.stop();
System.out.printf("优化前执行时长: %d 毫秒",stopWatch.getTotalTimeMillis());
StopWatch stopWatch1 = new StopWatch();
stopWatch1.start();
Map<String, List<SysRole>> roleMap = roleList.stream().collect(Collectors.groupingBy(SysRole::getId));
for (SysUserRole userRole : userRoleList) {
List<SysRole> sysRoles = roleMap.get(String.valueOf(userRole.getRoleId()));
if(CollectionUtils.isNotEmpty(sysRoles)){
String roleName = sysRoles.get(0).getRoleName();
// System.out.println(roleName);
}
}
stopWatch1.stop();
System.out.printf("优化后执行时长: %d 毫秒",stopWatch1.getTotalTimeMillis());
}