3

我有这样的选择

    @CommandLine.Option(names = "-D", description = "Define a symbol.")
    /* A list of defines provided by the user. */
    Map<String, String> defines = new LinkedHashMap<String, String>();

当我执行以下操作时,这确实有效:

-Dkey=value

但是当我这样做时

-Dkey

这没用。有没有办法为没有关联值的键添加默认值?

4

1 回答 1

2

更新:从 picocli 4.6 开始,这可以通过在选项或位置参数中指定mapFallbackValue来完成。

@Option(names = {"-P", "--properties"}, mapFallbackValue = Option.NULL_VALUE)
Map<String, Optional<Integer>> properties;

@Parameters(mapFallbackValue= "INFO", description= "... ${MAP-FALLBACK-VALUE} ...")
Map<Class<?>, LogLevel> logLevels;

值类型可以包装在java.util.Optional. (如果不是,并且后备值为Option.NULL_VALUE,picocli 会将值放入null指定键的映射中。)


(原答案如下):

这可以通过自定义 parameterConsumer来完成。例如:

/* A list of defines provided by the user. */
@Option(names = "-D", parameterConsumer = MyMapParameterConsumer.class,
  description = "Define a symbol.")
Map<String, String> defines = new LinkedHashMap<String, String>();

...在哪里MyMapParameterConsumer可以看起来像这样:


class MyMapParameterConsumer implements IParameterConsumer {
    @Override
    public void consumeParameters(
            Stack<String> args, 
            ArgSpec argSpec, 
            CommandSpec commandSpec) {

        if (args.isEmpty()) {
            throw new ParameterException(commandSpec.commandLine(), 
                    "Missing required parameter");
        }
        String parameter = args.pop();
        String[] keyValue = parameter.split("=", 1);
        String key = keyValue[0];
        String value = keyValue.length > 1 
                ? keyValue[1]
                : "MY_DEFAULT";
        Map<String, String> map = argSpec.getValue();
        map.put(key, value);
    }
}
于 2019-10-26T01:16:58.160 回答