Как использовать лямбда-выражения в коллекциях и массивах - PullRequest
0 голосов
/ 31 марта 2020

У меня есть закрытый код void, который сравнивает два класса. В этом типичном коде я хочу иметь возможность использовать / применять лямбда-выражение, где изначально лямбда не используется. Пробовал несколько методов, таких как карты, потоки или фильтры, но, похоже, я не получаю точный формат кода, вот код, который я хочу применить лямбда-выражения. Нужен только этот код

     private void checkPrivileges(User user) {
            Collection<Role> roles = user.getAllRoles();
            List<String> requiredPrivs = new ArrayList<>();
            for (Role r : roles) {

                if (r.getRole().equals(RoleConstants.SUPERUSER)
                        && !Context.hasPrivilege(PrivilegeConstants.ASSIGN_SYSTEM_DEVELOPER_ROLE)) {
                    throw new APIException("User.you.must.have.role", new Object[] { RoleConstants.SUPERUSER });
                }
                if (r.getPrivileges() != null) {
                    for (Privilege p : r.getPrivileges()) {
                        if (!Context.hasPrivilege(p.getPrivilege())) {
                            requiredPrivs.add(p.getPrivilege());
                        }
                    }
                }
            }

            if (requiredPrivs.size() == 1) {
                throw new APIException("User.you.must.have.privilege", new Object[] { requiredPrivs.get(0) });
            } else if (requiredPrivs.size() > 1) {
                StringBuilder txt = new StringBuilder("You must have the following privileges in order to assign them: ");
                for (String s : requiredPrivs) {
                    txt.append(s).append(", ");
                }
                throw new APIException(text.substring(0, text.length() - 2));
            }
        }

Имеет соответствующий класс ролей. java и Привилегия. java. Моя проблема заключается в том, чтобы использовать только лямбда-выражения только в классе void. Вот испытание, которое я сделал, но это была половина моей задачи

role.getPrivileges().stream()
    .filter(()->{
          return Optional.of(privileges)
              .filter(given ->given.p.get privileges())
              .getOrElse("privilege required:" +p)});

1 Ответ

0 голосов
/ 31 марта 2020

Я бы сгладил иерархию for-if-for и выделил бы константу + контрольный метод, подобный:

private static final String ERROR_FORMAT = "You must have the following privileges in order to assign them: %s";

private void checkPrivileges(User user) {
    List<String> requiredPrivs = new ArrayList<>();
    for (Role r : user.getAllRoles()) {
        checkSuperUserPrivilege(r);
        Iterable<Privilege> privileges = r.getPrivileges() != null ? r.getPrivileges() : Collections.emptySet();
        for (Privilege p : privileges) {
            if (!Context.hasPrivilege(p.getPrivilege())) {
                requiredPrivs.add(p.getPrivilege());
            }
        }
    }
    if (requiredPrivs.size() == 1) {
        throw new APIException("User.you.must.have.privilege", new Object[] { requiredPrivs.get(0) });
    } else if (requiredPrivs.size() > 1) {
        throw new APIException(String.format(ERROR_FORMAT, String.join(", ", requiredPrivs)));
    }
}

private void checkSuperUserPrivilege(Role r) {
    if(r.getRole().equals(RoleConstants.SUPERUSER)
            && !Context.hasPrivilege(PrivilegeConstants.ASSIGN_SYSTEM_DEVELOPER_ROLE)) {
        throw new APIException("User.you.must.have.role", new Object[] { RoleConstants.SUPERUSER });
    }
}

Как я уже говорил в комментариях, плохо обрабатывать это с помощью потоков, но здесь вы go:

private static final String ERROR_FORMAT = "You must have the following privileges in order to assign them: %s";

private void checkPrivileges(User user) {
    List<String> requiredPrivs = user.getAllRoles().stream()
            .peek(this::checkSuperUserPrivilege)
            .map(Role::getPrivileges)
            .filter(Objects::nonNull)
            .flatMap(Collection::stream)
            .map(Privilege::getPrivilege)
            .filter(p -> !Context.hasPrivilege(p))
            .collect(Collectors.toList());
    if (requiredPrivs.size() == 1) {
        throw new APIException("User.you.must.have.privilege", new Object[] { requiredPrivs.get(0) });
    } else if (requiredPrivs.size() > 1) {
        throw new APIException(String.format(ERROR_FORMAT, String.join(", ", requiredPrivs)));
    }
}

private void checkSuperUserPrivilege(Role r) {
    if(r.getRole().equals(RoleConstants.SUPERUSER)
            && !Context.hasPrivilege(PrivilegeConstants.ASSIGN_SYSTEM_DEVELOPER_ROLE)) {
        throw new APIException("User.you.must.have.role", new Object[] { RoleConstants.SUPERUSER });
    }
}
...