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