Java 8 lambda添加到Hashmap中的Hashmap中的列表中

JTK*_*JTK 3 java lambda hashmap java-8

我有一个List<POJO>我想从中提取数据,我感兴趣的变量是:

  • 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);
}
Run Code Online (Sandbox Code Playgroud)

首先,是否有一种速记方式来迭代List内部Map使用Java8

其次,我的代码不太正确,所以目前地图将所有Throughput值添加到其Application键中,因此我最终得到了18个带有值列表的键.

我需要它做的是envMap我应该有7个Environment对象,每个Application对象有18个对象和值,所以Application总共会有126个对象.这可以通过我尝试的方式实现,是否有Lambda方法来实现这一目标?

Tun*_*aki 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())
            )
        ));
Run Code Online (Sandbox Code Playgroud)