2016-03-08 80 views
3

我有一個List<POJO>,我想從中提取數據,我感興趣的變量是:的Java 8拉姆達添加到HashMap中的列表,在一個HashMap

  • Environment: String
  • Application: String
  • Throughput: Double

有7個Environment對象和每個Environment擁有18 Application對象,每個對象具有多個values

我試圖遍歷List<POJO>,並在Hashmap<Environment.ToString, Hashmap<Applications.ToString, List<Double>>

我試圖用Java 8的lambda功能將這些值存儲;到目前爲止我的代碼:

private HashMap<String, List<BigDecimal>> appMap = new HashMap<String, List<BigDecimal>>(); 
private HashMap<String, HashMap> envMap = new HashMap<String, HashMap>(); 

for(POJO chartModel: List<POJO>) { 
    appMap.computeIfAbsent(chartModel.getName(), v -> new ArrayList<BigDecimal>()) 
      .add(BigDecimal.valueOf(chartModel.getThroughput())); 
    envMap.put(chartModel.getEnvironment(), appMap); 
} 

首先,有沒有遍歷內MapList使用Java8一條捷徑?其次,我的代碼並不完全正確,因此當前地圖將所有Throughput的值添加到它的Application密鑰中,所以我最終得到了具有值列表的18個密鑰。

我需要做的是在我的envMap我應該有7個Environment對象,每個都具有其18個Application對象和值,那麼將有總共126個Application對象。這可以通過我嘗試它的方式來實現嗎?是否有Lambda方法來實現這一目標?

+1

那麼,對於初學者來說,你只有一個'appMap'實例,並且這將被插入到'envMap'中7次,每個'Environment'都會被插入一次。 –

回答

6

您需要使用2個按操作分組:第一個按照環境分組,第二個按照名稱分組。最後,您需要將每個值映射到其吞吐量的值BigDecimal

假設pojoList<POJO>

Map<String, Map<String, List<BigDecimal>>> result = 
    pojo.stream() 
     .collect(Collectors.groupingBy(
      POJO::getEnvironment, 
      Collectors.groupingBy(
       POJO::getName, 
       Collectors.mapping(p -> BigDecimal.valueOf(p.getThroughput()), Collectors.toList()) 
      ) 
     )); 
+0

這很完美,謝謝。 – Johntk

3

您只創建一個MapappMap,你所投入envMap每一個關鍵。您顯然想要爲每個不同的密鑰創建新的Map,並且您已經知道正確的工具computeIfAbsent。但你也應該介意「diamond operator」。雖然不是新的Java 8特性,但您的代碼顯然會從刪除類型參數的重複中受益。綜合起來,該操作將是這樣的:

HashMap<String, Map<String, List<BigDecimal>>> envMap = new HashMap<>(); 
for(POJO chartModel: list) { 
    envMap.computeIfAbsent(chartModel.getEnvironment(), env -> new HashMap<>()) 
     .computeIfAbsent(chartModel.getName(), name -> new ArrayList<>()) 
     .add(BigDecimal.valueOf(chartModel.getThroughput())); 
} 

你也可以使用使用Stream API,as shown by Tunaki相同的邏輯,但你並不需要。

+0

使用其中一種方法有什麼優勢嗎? – Johntk

+2

在這個特定的情況下,沒有重要的區別。你可以使用任何你喜歡的東西,但是這是值得的。 – Holger

+0

我實際上更喜歡這個解決方案,因爲在這裏我們有更少的嵌套調用。連續五個右括號太多。 –