2015-11-08 31 views
1

我有跟蹤主機,文件,每個文件的各個部分的容器:如何傳遞一個新的單值地圖作爲參數?

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

+0

http://docs.oracle.com/javase/7/docs/api/java/util/Collections.html#singletonMap(K,%20V) –

回答

1

這裏是一條線做不會造成任何匿名類的方式。

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

這需要Java 7的鑽石<>

如果你實際上並不需要HashMapArrayList(即任何舊MapList會做),你只需擺脫new HashMap<>new ArrayList<>

1

在-線路改造將是 -

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

我對Java不是很熟悉 - 什麼是「 {{'和'}}呢? – MrDuk

+1

這將創建一個帶有實例初始值設定項的匿名內部類(也稱爲「雙重大括號初始化」) –

+0

我建議通過使用Arrays.asList來避免額外的類。再次檢查問題後,實際上可以將分片傳遞給ArrayList的構造函數。總體而言,您可以通過使用當前類的初始化程序來避免額外的類,而不是對映射和列表進行子類化。更多關於爲什麼你應該嘗試並避免「double brance initialization」[這裏](http://stackoverflow.com/questions/924285/efficiency-of-java-double-brace-initialization) –