2017-07-19 84 views
2

有沒有什麼辦法可以在lambda函數內創建這個hashmap?如何創建一個HashMap來迭代lambda函數?

 Map<SaleStatus, Long> sales = new HashMap<>(); 
    saleStatusCounters.forEach(saleStatusCounter -> sales.put(saleStatusCounter.getStatus(), saleStatusCounter.getMatches())); 

事情是這樣的:

 saleStatusCounters.stream() 
      .map(obj -> new HashMap<SaleStatus, Long>().put(obj.getStatus(), obj.getMatches())) 
      .collect(Collectors.toMap(???))); 
+1

閱讀[文檔](https://docs.oracle.com/javase/8/docs/api/java/util/stream/Collectors.html#toMap-java.util.function.Function-java.util .function.Function - )... –

+2

你究竟想在這裏做什麼?爲什麼'Collectors.toMap'不夠? – chrylis

回答

5

你的代碼是罰款的。你可以,但是,使用流和Collectors.toMap得到結果,你想:

Map<SaleStatus, Long> sales = saleStatusCounters.stream() 
    .collect(Collectors.toMap(obj -> obj.getStatus(), obj -> obj.getMatches())); 

注:因爲在地圖上都沒有衝突這漫長的工作方式,即只要你不具有兩個或兩個以上銷售狀態計數器對象具有相同的狀態。

如果您有您的列表中有相同的地位超過一個元素,你應該使用的Collectors.toMap that expects a merge function重載版本:

Map<SaleStatus, Long> sales = saleStatusCounters.stream() 
    .collect(Collectors.toMap(
     obj -> obj.getStatus(), 
     obj -> obj.getMatches(), 
     Long::sum)); 

這裏Long::sumBinaryOperator<Long>該合併映射到兩個值同樣的鑰匙。

+1

或者'SaleStatus :: getStatus,SaleStatus :: getMatches'? – chrylis

+0

@chrylis嗯,我沒有類的名字,'SaleStatus'就是getStatus()方法返回的內容。 –

+0

對,我住在Groovy的土地上這麼久,對我來說都只是'it.status'! – chrylis

相關問題