Как ограничить выбор пользователем только двух перечислений из списка с использованием Java Streams?

#java #enums #stream

Вопрос:

У меня есть класс enum, из которого пользователь может выбрать до 2 вариантов. Если он выберет более 2, должно появиться сообщение об ошибке.

Я хотел бы сделать это с помощью Java streams. Я все еще пытаюсь понять, как они работают.

До сих пор я придумал этот фрагмент кода в:

 public enum UserSkills {

    HARD_WORKNG("HARD_WORKNG"),
    ON_TIME("ON_TIME"),
    HONEST("HONEST");

    public final String value;

    UserSkills(String value) {
        this.value = value;
    }

    @Override
    public String toString() {
        return name()   "["   value   "]";
    }

    public static List < UserSkills > of (String userSkills) {
        notNull(userSkills, "userSkills cannot be null");
        return Arrays.stream(values())
            .flatMap(s - > {
                if (values().length > 3) {
                    throw new IllegalArgumentException(String.format("you can only choose up to 3 user skills", userSkills));
                } else {

                }
            }).collect(Collectors.toList());
    }
}
 

Я не уверен, как закончить это, любой совет приветствуется.

Комментарии:

1. Зачем использовать streams для этого? Казалось бы, было бы намного проще не делать этого.

2. Хорошо, что вы имеете в виду?

3. Все зависит от вашей программы. А также кажется немного странным иметь проверку пользовательского ввода в самом перечислении, поскольку это, похоже, противоречит «правилу единой ответственности»

Ответ №1:

Кажется, что метод of должен принимать vararg String ... userSkills (или входная строка должна быть каким-то образом разделена, чтобы идентифицировать несколько значений перечисления):

 public static List<UserSkills> of (String ... userSkills) {
    List<UserSkills> result = Arrays.stream(userSkills)
        .filter(Objects::nonNull)
        .map(UserSkills::valueOf) // throws IllegalArgumentException no enum constant
        .distinct()
        .collect(Collectors.toList());
        
    if (result.size() > 2) {
        throw new IllegalArgumentException("Only 2 skills can be selected");
    }
    return resu<
}
 

Тест:

 List<UserSkills> skills = UserSkills.of(null, "HARD_WORKNG", "HONEST", "HARD_WORKNG", "ON_TIME");

Exception in thread "main" java.lang.IllegalArgumentException: Only 2 skills can be selected
 
 List<UserSkills> skills = UserSkills.of(null, "HARD_WORKNG", "HONEST", "HARD_WORKNG");
System.out.println(skills);
 

Вывод:

 [HARD_WORKNG[HARD_WORKNG], HONEST[HONEST]]
 

Комментарии:

1. Спасибо за ваш ответ. У меня только один вопрос. Эта строка кода .map(PlayerSkills::valueOf) выдает ошибку, что значение valueOf неоднозначно

2. Это предупреждение? Я тестировал онлайн . он успешно запущен.

3. Мой плохой, да, он работает правильно. Большое вам спасибо за ваш ответ 🙂