【问题标题】:How to limit user to choose just two enums from list using Java Streams?如何限制用户使用 Java Streams 从列表中仅选择两个枚举?
【发布时间】:2023-03-22 04:22:01
【问题描述】:

我有一个枚举类,用户可以从中选择最多 2 个选项。 如果他选择超过 2 个,则应显示错误消息。

我想使用 Java 流来做到这一点。我仍在试图弄清楚它们是如何工作的。

到目前为止,我想出了这段代码:

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());
    }
}

我不知道如何完成它任何建议表示赞赏。

【问题讨论】:

  • 为什么要为此使用流?不这样做似乎要简单得多。
  • 好的,你有什么想法?
  • 这一切都取决于你的程序。而且,在枚举本身中进行用户输入验证似乎有点奇怪,因为这似乎违反了“单一责任规则”

标签: java enums stream


【解决方案1】:

似乎of 方法应该接受一个可变参数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 result;
}

测试:

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]]

【讨论】:

  • 感谢您的回答。我只有一个问题。这行代码.map(PlayerSkills::valueOf)给出了valueOf不明确的错误
  • 是警告吗?我测试了online。它运行成功。
  • 我的错,是的,它工作正常。非常感谢您的回答:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-04-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多