我想将现有代码转换为Lamda表达式。
Map<Integer, List<Permission>> rpMap = new HashMap<>();
List<Integer> loginAccessCodes = loginAccessDao.getAuthorizedPermissions(loginId);
List<AccessCode> roles = roleDAO.getAllRoles();
for (AccessCode accessCode : roles) {
List<Permission> rolePermissions = rolePermissionDAO.getRolePermissions(accessCode.getAcCodeId());
for (Permission permission: rolePermissions) {
if (! loginAccessCodes.contains(permission.getPermId())) {
permission.setChecked(false);
permission.setGrayed(true);
}
}
rpMap.put(accessCode.getAcCodeId(), rolePermissions);
}
到目前为止,我有:
List<Permission> permissions = roles.stream()
.map(AccessCode -> rolePermissionDAO.getRolePermissions(AccessCode.getAcCodeId()))
.flatMap(rolePermissions -> rolePermissions.stream())
.filter(permission -> !loginAccessCodes.contains(permission.getPermId()))
.map(permission -> { permission.setChecked(false); permission.setGrayed(true); return permission; })
.collect(Collectors.toList());
答案 0 :(得分:1)
在当前上下文中使用流(lambda表达式)不好的一个原因是,您最终在某些Permission
条件下修改了对象filter
并设置了一些属性。
尚不清楚的另一件事是accessCode.getAcCodeId()
和permission.getPermId()
之间的关系。在这两个相等的假设下,您可以将迭代方法表示为:
Map<Integer, List<Permission>> rpMap = roles.stream()
.map(accessCode -> getRolePermissions(accessCode.getAcCodeId()))
.flatMap(Collection::stream)
.filter(permission -> !loginAccessCodes.contains(permission.getPermId()))
// following is what fails the purpose of using streams here
.map(permission -> {
permission.setChecked(false);
permission.setGrayed(true);
return permission;
})
.collect(Collectors.groupingBy(Permission::getPermId));
此外,如果可以适当地推导这两个ids
之间的关系,则可以进一步将此方法修改为(请注意注释):
Map<Integer, List<Permission>> rpMap = roles.stream()
// filter based on accessCode logic itself
.filter(accessCode -> !loginAccessCodes.contains(accessCode.getAcCodeId()))
// set the parameters within function called inside 'map'
.map(accessCode -> getRolePermissionsWithFlagsSet(accessCode.getAcCodeId()))
.flatMap(Collection::stream) // flat it to Stream<Permission>
.collect(Collectors.groupingBy(Permission::getPermId)); // group it using the 'id' (Integer)