前幾天看同事的代碼,發現他有個地方用了java8的flatMap扁平化流來處理兩個集合的交集並集。我就測了一下,是否有必要這樣做。
接下來我們看一下,首先有兩個實體類,第一個實體類是user類
@Data
@EqualsAndHashCode(callSuper = false)
@Accessors(chain = true)
@AllArgsConstructor
@NoArgsConstructor
@Builder
public class SysUser implements Serializable {
private static final long serialVersionUID=1L;
/**
* 用戶ID
*/
@TableId(value = "user_id", type = IdType.AUTO)
private Long userId;
/**
* 部門ID
*/
private Long deptId;
/**
* 登錄賬號
*/
private String loginName;
/**
* 用戶暱稱
*/
private String userName;
/** 角色組 */
private Long[] roleIds;
/** 崗位組 */
private Long[] postIds;
}
第二個實體類,用戶角色類
@Data
@EqualsAndHashCode(callSuper = false)
@Accessors(chain = true)
public class SysUserRole implements Serializable {
private static final long serialVersionUID=1L;
/**
* 用戶ID
*/
private Long userId;
/**
* 角色ID
*/
private Long roleId;
}
然後新增一個單元測試,有userList集合,和一個userRoleList集合,此時,當user集合中的id與userRole集合中userId相等的值取出來。以下測試一個用的flatMap,另一個用的雙重for循環。
package com.example.shardingSphere;
import com.example.shardingSphere.entity.SysUser;
import com.example.shardingSphere.entity.SysUserRole;
import com.example.shardingSphere.entity.UserRoleDeptListVO;
import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;
/**
* @author liushan
* @since 19:34
*/
public class FlatMapTest {
public static void main(String[] args) {
List<SysUser> userList = new ArrayList<>();
SysUser sysUser = new SysUser();
sysUser.setUserId(1L);
sysUser.setUserName("jiuo");
SysUser sysUser1 = new SysUser();
sysUser1.setUserId(2L);
sysUser1.setUserName("hahahha");
userList.add(sysUser);
userList.add(sysUser1);
List<SysUserRole> userRoleList = new ArrayList<>();
SysUserRole sysUserRole = new SysUserRole();
sysUserRole.setRoleId(2L);
sysUserRole.setUserId(1L);
userRoleList.add(sysUserRole);
long l = System.currentTimeMillis();
List<UserRoleDeptListVO> userRoleDeptListVOS = userList.stream().flatMap(user -> {
return userRoleList.stream().filter(role -> role.getUserId() == user.getUserId())
.map(userrole -> {
return new UserRoleDeptListVO(user.getUserId(), userrole.getRoleId(), user.getDeptId(), user.getUserName());
});
}).collect(Collectors.toList());
long l2 = System.currentTimeMillis();
System.out.println("flatMap花費的時間: " + (l2 - l));
System.out.println(userRoleDeptListVOS);
long l3 = System.currentTimeMillis();
List<UserRoleDeptListVO> userRoleDeptListVOS1 = new ArrayList<>();
for (SysUser user : userList) {
for (SysUserRole userRole : userRoleList) {
if (user.getUserId() == userRole.getUserId()) {
UserRoleDeptListVO userRoleDeptListVO = new UserRoleDeptListVO(user.getUserId(), userRole.getRoleId(), user.getDeptId(), user.getUserName());
userRoleDeptListVOS1.add(userRoleDeptListVO);
}
}
}
long l4= System.currentTimeMillis();
System.out.println("for花費的時間: " + (l4 - l3));
System.out.println(userRoleDeptListVOS1);
}
}
得到的結果爲
flatMap花的時間爲50-100ms左右,而雙重for循環一直是5ms以下。
現在大家都提倡用stream,但明顯並不是都適合。代碼並不是追求高大上,而是效率,質量。