繁体   English   中英

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

[英]Java 8 lambda adding to a list in a Hashmap, in a Hashmap

我有一个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);
}

首先,是否有一种使用Java8在内部Map内迭代ListJava8

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

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

您需要按操作使用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())
            )
        ));

您只创建了一个Map appMap ,您将为每个键添加到envMap中。 您显然希望为每个不同的密钥创建一个新的Map ,并且您已经知道正确的工具computeIfAbsent 但你也应该关注“钻石运营商” 虽然不是新的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表达相同的逻辑, 如Tunaki所示 ,但您不需要。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM