仅允许指定的命令名称,但仍允许其他参数

时间:2020-02-20 16:05:07

标签: java java-stream

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

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

每个命令类都有自己的getName()方法。 getName()的{​​{1}}方法就是这样:

ExitCommand()

不幸的是,对于当前流,@Override public String getName() { return "exit"; } 也被接受。不过,我不能使用"exittttttt",因为有些命令的命令名称后面带有后续参数。

例如:

.equals(cmd.getName())

但是完整的命令是@Override public String getName() { return "delete track"; }

有人知道如何只允许在每个delete track <id>方法中指定的命令名称,又如何允许其他参数吗?

编辑:

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

3 个答案:

答案 0 :(得分: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() + " "))

答案 1 :(得分:0)

那行呢?

final Command command = commands.stream()
        .filter(cmd -> (input.split(" +").length > 0 && input.split(" +")[0].equals(cmd.getName())))
        .findAny()
        .orElseThrow(() -> new InvalidInputException("unknown command"));

答案 2 :(得分:0)

您的设计需要重新审查。当我们说一个命令时,它将具有选项和参数。在您的情况下,您要结合使用命令和选项。只需将它们分开,并使用等于进行命令比较。

delete -track <id>
  • 删除命令

  • track-选项可以用连字符开头

  • 可选参数