[英]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
内迭代List
的Java8
?
其次,我的代码不太正确,所以当前地图将所有Throughput
值添加到其Application
键,因此我最终得到了18个带有值列表的键。
我需要它做的是在我的envMap
我应该有7个Environment
对象,每个对象都有18个Application
对象和值,所以总共有126个Application
对象。 这可以通过我尝试的方式实现,是否有Lambda方法来实现这一目标?
您需要按操作使用2个分组:第一个按照环境分组,第二个根据名称分组。 最后,您需要将每个值映射到其吞吐量的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())
)
));
您只创建了一个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.