2016-03-08 75 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

我实际上更喜欢这个解决方案,因为在这里我们有更少的嵌套调用。连续五个右括号太多。 –