Вопрос о лямбда-коллекциях требовал помощи при переборе нескольких коллекций - PullRequest
0 голосов
/ 07 января 2019

Я хочу преобразовать существующий код в выражение 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 голосов
/ 08 января 2019

Причина, по которой в вашем текущем контексте нецелесообразно использовать потоки (лямбда-выражения), заключается в том, что вы в конечном итоге модифицируете объект 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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...