Java 8 lambda如何将元素添加到HashMap中的列表中?

4

我有一个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中的List?
其次,我的代码还不太正确,所以当前Map将所有的Throughput值添加到它的Application键中,这样我最终会得到18个带有值列表的键。
我需要做的是在envMap中应该有7个Environment对象,每个对象都有它的18个Application对象和值,所以总共会有126个Application对象。 我尝试使用这种方式来完成它,是否可以实现,是否有一种Lambda的方式来实现它?

1
首先,你只有一个 appMap 实例,这将被插入到 envMap 中 7 次,每个 Environment 都会插入一次。 - Erick G. Hagstrom
2个回答

6
您需要使用两个分组操作:第一个根据环境进行分组,第二个根据名称进行分组。最后,您需要将每个值映射到其吞吐量的BigDecimal值。
假设pojo是一个List<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())
            )
        ));

4
你只创建了一个名为appMapMap,然后将其放入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表达相同的逻辑,如Tunaki所示,但您不需要这样做。


使用其中一种方法是否有任何优势? - JTK
2
在这种特定情况下,没有重要的区别。你可以使用任何你喜欢的方式,但了解两种方法都是值得的。 - Holger
我实际上更喜欢这个解决方案,因为这里有较少的嵌套调用。五个连续的闭合括号太多了。 - Tagir Valeev

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接