java - Java 8 Lambda 映射到地图>
问题描述
我有一个服务返回响应并将其映射到Map<String, String> object
在此之后,我需要计算新地图的键并插入所有出现的键以及它们执行的次数。
它们的键是通过获取关联字符串的第一个字符来计算的。
Key: A -> August/Air
Key: B -> Boat/Big
例子:
服务响应:
{
{
"august",
"red"
},
{
"air",
"red"
},
{
"boat",
"blue"
},
{
"big",
"red"
}
}
预期输出:
{
"a" : {
"red" : 2
},
"b" : {
"blue" : 1,
"red": 1
}
}
我已经在 Java 7 中这样做了,但我想将 lambdas 应用于此。
Map<String, Map<String, AtomicLong>> map = new HashMap<>();
String key = ...
String value = ...
Response.incrementCount(key, value);
map.put(key, Response.count.get(key));
响应.java
public static Map<String, Map<String, AtomicLong>> count = new HashMap<>();
public static void incrementCount(String key, String value) {
count.computeIfAbsent(key, k -> new HashMap<>());
AtomicLong actual = count.get(key).get(value);
Map<String, AtomicLong> stringAtomicLongMap = count.get(key);
if (null == actual) {
actual = new AtomicLong();
stringAtomicLongMap.put(value, actual);
count.put(key, stringAtomicLongMap);
}
actual.incrementAndGet();
}
解决方案
这是使用 Stream API 的解决方案:
Map<String, Map<String, Long>> resultMap = map.entrySet().stream()
.map(entry -> {
String firstChar = entry.getKey().substring(0, 1);
return new AbstractMap.SimpleEntry<>(firstChar, entry.getValue());
})
.collect(Collectors.groupingBy(
Map.Entry::getKey,
Collectors.groupingBy(Map.Entry::getValue, Collectors.counting())
));
实际发生了什么:
- 给定条目被更改为只有第一个字符(但作为字符串)作为它们的条目键
- 此类条目按键(第一个字符)分组
- 如果此键有多个值 - 它们按条目值分组 - 并计算这些值
推荐阅读
- python - 如何在 Elasticsearch 服务器前创建 Flask REST API?
- javascript - 如何在 Chrome 上请求用户对音频的许可?
- python - Python tzinfo=pytz.utc 关于现有时间
- java - 将大字节数组转换为双变量中的自然数
- python - 为什么我们需要在登录后从客户端为每个 API 发送 JWT,因为 DRF 在 settings.py 中登录后维护 isAuthenticated 标志?
- excel - Sub 的限定符无效
- html - 如何使用html中的注销按钮在网站主页的导航栏中添加图像
- git - Git push 在推送后显示我不相关的文件夹
- java - 如何修复 IndexOutOfBoundsException 问题
- r - R:在数据框中获取匹配表情符号对的频率时遇到问题