Java 输入不固定时如何避免switch语句?

Java 输入不固定时如何避免switch语句?,java,switch-statement,Java,Switch Statement,我已经写了下面的代码 public enum ProcessEnums { ASSIGNMENT, CREDIT,HOWMANY,HOWMUCH,ERROR; } public final class StringConstants { public static final String Error = "I have no idea what you are talking about"; public static final String rgxAssignment =

我已经写了下面的代码

public enum ProcessEnums {
ASSIGNMENT, CREDIT,HOWMANY,HOWMUCH,ERROR;
}

public final class StringConstants {
    public static final String Error = "I have no idea what you are talking about";
    public static final String rgxAssignment = "^([a-z]+) is ([I|V|X|L|C|D|M])$";
    public static final String rgxCredits = "((?:[a-z]+ )+)([A-Z]\\w+) is (\\d+) ([A-Z]\\w+)$";
    public static final String rgxHowMany= "^how many ([a-zA-Z]\\w+) is ((?:\\w+ )+)([A-Z]\\w+) \\?$";
    public static final String rgxHowMuch = "^how much is ((?:\\w+[^0-9] )+)\\?$";
}
private ProcessEnums checkMessage(String line) {
    ProcessEnums flag = ProcessEnums.ERROR;
    String[] rgxArray = new String[] { rgxAssignment, rgxCredits,
            rgxHowMany, rgxHowMuch };
    for (int i = 0; i < rgxArray.length; i++) {
        Pattern ptn = Pattern.compile(rgxArray[i]);
        Matcher mcher = ptn.matcher(line);
        if (mcher.matches()) {
            switch (i) {
            case 0:
                return ProcessEnums.ASSIGNMENT;

            case 1:
                return ProcessEnums.CREDIT;

            case 2:
                return ProcessEnums.HOWMANY;

            case 3:
                return ProcessEnums.HOWMUCH;

            default:
                break;
            }
        }
    }
    return flag;
}
公共枚举进程枚举{
分配,信用,多少,多少,错误;
}
公共最终类字符串常量{
public static final String Error=“我不知道你在说什么”;
公共静态最终字符串rgxAssignment=“^([a-z]+)是([I|V|X|L|C|D|M])”;
公共静态最终字符串rgxCredits=“((?:[a-z]+)+)([a-z]\\w+)是(\\d+)([a-z]\\w+)”;
公共静态最终字符串rgxHowMany=“^a-zA-Z]\\w+是多少((?:\\w+)([a-Z]\\w+\?$”;
公共静态最终字符串rgxhowmount=“^What mound is((?:\\w+[^0-9])+)\?$”;
}
私有进程枚举检查消息(字符串行){
ProcessEnums标志=ProcessEnums.ERROR;
字符串[]rgxArray=新字符串[]{rgxAssignment,rgxCredits,
rgxhowmone,rgxhowmone};
对于(int i=0;i
正如您所看到的,我在CheckMessageAPI中没有得到固定的输入。我如何在没有开关块的情况下实现这一点。我已经想过使用Map,但我没有任何固定的标识符作为输入字符串

准确地说,我正在寻找一种解决方案,不必在枚举列表上迭代

将代码放入
枚举

使用
异常
对于异常情况,不要使用标记值<代码>异常存在是有原因的

这还允许您添加新模式,而无需更改代码

注意迭代的顺序将是声明的顺序,更具体的模式需要先执行


最后,
ProcessEnum.values()
将在每次调用时返回
ProcessEnum[]
的新副本。为了提高效率,您可能希望将其缓存在
静态final
变量中。

我们仍在迭代各种可能性?我一直在寻找解决方案,我不必重复所有的问题enums@Sach由于您的代码依赖于正则表达式来检测输入的类型,因此无法绕过这一点-您必须迭代正则表达式并测试每个表达式。如果您不想这样做,您需要重新思考您的核心逻辑。@BoristSpider如何在Java 6或7上解决这个问题。版本中没有Lambda表达式。@TienNguyen在编写时没有Lambda表达式。@BoristheSpider:我的基本要求是,当消息传入时,我需要对其进行处理。字符串中有明确的值,这就是我使用正则表达式的原因。我已经厌倦了这些方法,所以我想在这个问题上放弃一个问题,当你对答案投了赞成票时改变你的问题是非常不礼貌的。我还没有投反对票。当我看到你的回答时,我的回答被否决了。尽管如此,礼仪还是很糟糕。这意味着我为答案付出的努力基本上是白费的。社区为阅读你的问题和我的答案所付出的努力都白费了。这进一步意味着这个问题对未来毫无用处,这是SO的核心设计原则。请确保你再也不要这样做了。@Sach这并不意味着你对答案投了高票。由于答案是向上投票的,因此改变问题会使答案和作者所付出的努力无效。
public enum ProcessEnum implements Predicate<String> {
    ASSIGNMENT("^([a-z]+) is ([I|V|X|L|C|D|M])$"),
    CREDIT("((?:[a-z]+ )+)([A-Z]\\w+) is (\\d+) ([A-Z]\\w+)$"),
    HOWMANY("^how many ([a-zA-Z]\\w+) is ((?:\\w+ )+)([A-Z]\\w+) \\?$"),
    HOWMUCH("^how much is ((?:\\w+[^0-9] )+)\\?$");

    private final Pattern patt;

    ProcessEnum(final String regex) {
        this.patt = Pattern.compile(regex);
    }


    @Override
    public boolean test(final String s) {
        return patt.matcher(s).matches();
    }
}
private ProcessEnum checkMessage(String line) {
    return Arrays.stream(ProcessEnum.values())
            .filter(pe -> pe.test(line))
            .findFirst()
            .orElseThrow(() -> new IllegalArgumentException("I have no idea what you are talking about"));
}