2017-07-19 38 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

相关问题