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

Java 8 lambda添加到Hashmap中的列表,在Hashmap中,java,lambda,hashmap,java-8,Java,Lambda,Hashmap,Java 8,我有一个列表,我想从中提取数据,我感兴趣的变量有: 环境:字符串 应用程序:字符串 吞吐量:加倍 有7个环境对象,每个环境有18个应用程序对象,每个对象都有多个值 我试图遍历列表,并将这些值存储在Hashmap new ArrayList()中 .add(BigDecimal.valueOf(chartModel.getThroughput()); put(chartModel.getEnvironment(),appMap); } 首先,是否有一种使用Java8在内部Map中迭代列表的速

我有一个
列表
,我想从中提取数据,我感兴趣的变量有:

  • 环境:字符串
  • 应用程序:字符串
  • 吞吐量:加倍
有7个
环境
对象,每个
环境
有18个
应用程序
对象,每个对象都有多个

我试图遍历
列表
,并将这些值存储在
Hashmap new ArrayList()中
.add(BigDecimal.valueOf(chartModel.getThroughput());
put(chartModel.getEnvironment(),appMap);
}
首先,是否有一种使用
Java8
在内部
Map
中迭代
列表的速记方法

其次,我的代码不太正确,因此当前映射将所有的
吞吐量
值添加到它的
应用程序
键中,因此我最终得到了18个键和一个值列表


我需要它做的是在我的
envMap
中,我应该有7个
Environment
对象,每个对象都有18个
Application
对象和值,因此总共有126个
Application
对象。这可以通过我尝试的方式实现吗?有没有Lambda方法可以实现这一点?

您需要使用2种按操作分组:第一种根据环境分组,第二种根据名称分组。最后,您需要将每个值映射到其吞吐量的
BigDecimal

假设
pojo
是一个
列表

映射结果=
pojo.stream()
.collect(收集器.groupingBy(
POJO::getEnvironment,
收集者分组(
POJO::getName,
Collectors.mapping(p->BigDecimal.valueOf(p.getThroughput()),Collectors.toList())
)
));

您只创建了一个
Map
appMap
,每个键都将其放入
envMap
。显然,您希望为每个不同的键创建一个新的
映射
,并且您已经知道正确的工具,
computeIfAbsent
。但你也应该注意这一点。虽然不是一个新的Java8特性,但您的代码将明显受益于删除重复的类型参数。总而言之,操作将如下所示:

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()));
}
HashMap envMap=newhashmap();
用于(POJO图表模型:列表){
computeIfAbsent(chartModel.getEnvironment(),env->newHashMap())
.ComputeFabSent(chartModel.getName(),name->new ArrayList())
.add(BigDecimal.valueOf(chartModel.getThroughput());
}

您也可以使用流API表达相同的逻辑,但不需要。

好吧,对于初学者来说,您只有一个
appMap
的实例,它将被插入到
envMap
中7次,每个
环境一次。使用一种方法比另一种方法有什么好处吗?在这种特定情况下,没有重要的区别。您可以使用任何您喜欢的方法,但这两种方法都值得了解。实际上,我更喜欢这种解决方案,因为这里的嵌套调用较少。一行五个右括号太多了。
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())
            )
        ));
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()));
}