【问题标题】:How can I pass a new single value map as an argument?如何将新的单值映射作为参数传递?
【发布时间】:2016-02-09 00:42:44
【问题描述】:

我有一个跟踪主机、文件和每个文件的部分的容器:

private static Map<String, Map<String, ArrayList<FileShard>>> globalFileShardMap = new HashMap<String, Map<String, ArrayList<FileShard>>>();

我想在其中添加一个新条目,并且这样做是这样的:

 // filename and shard are known
 ArrayList<FileShard> initShard = new ArrayList<FileShard>();
 initShard.add(shard);

 Map<String, ArrayList<FileShard>> initMap = new HashMap<String, ArrayList<FileShard>>();
 initMap.put(filename,initShard);

 globalFileShardMap.put(Node.getLocal().getHostname(), initMap);

有没有办法将其压缩为一行,并将新的内部 Map 作为参数传递给globalFileShardMap.put

【问题讨论】:

标签: java arrays dictionary


【解决方案1】:

这是一种无需创建任何匿名类就可以在一行中完成的方法。

globalFileShardMap.put(Node.getLocal().getHostname(), 
    new HashMap<>(Collections.singletonMap(filename, 
    new ArrayList<>(Collections.singletonList(shard)))));

这需要 Java 7 用于菱形 &lt;&gt;

如果您实际上不需要HashMapArrayList(即任何旧的MapList 都可以),您可以去掉new HashMap&lt;&gt;new ArrayList&lt;&gt;

【讨论】:

    【解决方案2】:

    内联转换将是 -

    globalFileShardMap.put(Node.getLocal().getHostname(), new HashMap<String, ArrayList<FileShard>>(){{
         put(filename, new ArrayList<FileShard>(){{add(shard);}});
    }});
    

    【讨论】:

    • 我不是很精通 java - {{}} 做什么?
    • 这将创建带有实例初始化器的匿名内部类(也称为“双括号初始化”)
    • 我建议使用Arrays.asList 作为列表来避免额外的类。再次检查问题后,您实际上可以将分片传递给ArrayList 的构造函数。总的来说,您可以通过使用当前类的初始化程序来避免额外的类,而不是子类化映射和列表。更多关于为什么你应该尝试避免“双括号初始化”here
    • Arrays.asList 返回固定大小的列表。在这种情况下,List 使用单个元素对我来说没有多大意义。 ArrayList 更灵活。
    猜你喜欢
    • 2022-07-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-28
    • 2023-01-22
    • 1970-01-01
    相关资源
    最近更新 更多