#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. Мой плохой, да, он работает правильно. Большое вам спасибо за ваш ответ 🙂