我目前正在使用此代码来查找用户键入的命令:
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() + " "))
关于此行:
final Command command = commands.stream()
.filter(cmd -> (input.split(" +").length > 0 && input.split(" +")[0].equals(cmd.getName())))
.findAny()
.orElseThrow(() -> new InvalidInputException("unknown command"));
?
您的设计需要重新审查。当我们说一个命令时,它将具有选项和参数。在您的情况下,您要结合使用命令和选项。只需将它们分开,并使用等于进行命令比较。
delete -track <id>
删除命令
track-option可以用连字符开头标识>>
可选参数