Lambda集合质疑需要迭代处理多个集合的帮助

时间:2019-01-07 20:51:46

标签: java lambda java-8 java-stream

我想将现有代码转换为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());

1 个答案:

答案 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)