我目前正在使用此代码查找用户键入的命令:

final Command command = commands.stream()
        .filter(cmd -> input.startsWith(cmd.getName()))
        .findAny()
        .orElseThrow(() -> new InvalidInputException("unknown command"));


每个命令类都有自己的getName()方法。这是getName()ExitCommand()方法的样子:

@Override
public String getName() {
    return "exit";
}


不幸的是,对于当前流,"exittttttt"也被接受。但是,我不能使用.equals(cmd.getName()),因为有些命令在命令名之后带有后续参数。

例如:

@Override
public String getName() {
    return "delete track";
}


但是完整的命令是delete track <id>

有谁知道如何只允许在每个getName()方法中指定的命令名称,但仍然允许其他参数?

编辑:

每个命令都有自己的getArguments()方法。该方法将为exit命令返回0,为delete track命令返回1。也许可以用来解决这个问题?

最佳答案

如果空格始终将命令和参数分开,则可以使用

.filter(cmd -> (cmd.getArguments() == 0 && input.equals(cmd.getName()))
                 || input.startsWith(cmd.getName() + " "))


如果命令不支持任何参数,或者输入的命令名称后跟一个空格,则此命令将检查输入是否与命令名称完全匹配。

如果可以在不带参数的情况下调用支持参数的命令,则可能是正确的谓词:

.filter(cmd -> (cmd.getArguments() == 0 && input.equals(cmd.getName()))
                 || input.equals(cmd.getName()) //no args passed
                 || input.startsWith(cmd.getName() + " "))

关于java - 仅允许指定的命令名称,但仍允许其他参数,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/60324079/

10-11 22:32
查看更多