【问题标题】:Picocli: Specify default value for an option which has a type of MapPicocli:为具有 Map 类型的选项指定默认值
【发布时间】:2019-10-25 14:56:33
【问题描述】:

我有这样的选择

    @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

它不起作用。有没有办法为没有关联值的键添加默认值?

【问题讨论】:

    标签: java picocli


    【解决方案1】:

    更新:从 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 放入指定键的映射中。)


    (原答案如下):

    这可以通过custom 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);
        }
    }
    

    【讨论】:

    • 我不明白 args 是否意味着总参数而不是 -Dkey=value 对的参数?
    • 在调用consumeParameters 方法时,-D 选项已经被消费,但其参数仍在堆栈中。当参数附加到选项时(如-Dkey=value,解析器将分离参数并将其推回堆栈。所以key=value参数应该在堆栈的顶部,然后是剩余的命令行参数。
    猜你喜欢
    • 2013-09-18
    • 1970-01-01
    • 2012-04-13
    • 1970-01-01
    • 2011-05-30
    • 1970-01-01
    • 2015-05-05
    • 2019-04-01
    • 1970-01-01
    相关资源
    最近更新 更多