java-8 - 将map中的数组列表与java中的重复键合并
问题描述
我numbers[]
在以下请求中有多个数组
我想将它们合并到一张地图中。如果一个键存在于多个列表中,在这种情况下,我应该合并数组。
例如,Map
应该是这样的:
{60075=[100,200,500,600], 60076=[700,600]}
有人可以帮助我完成我的要求吗?
要求:
"details": [
{
"productSku": "60075",
"numbers": [
"100",
"200"
]
},
{
"productSku": "60075",
"numbers": [
"500",
"600"
]
},
{
"productSku": "60076",
"numbers": [
"700",
"600"
]
}
]
我尝试了以下代码,但它不起作用:
Map<String, List<String>> map1 = new HashMap<String, List<String>>();
for (Details details: detailsList) {
List<String> numbers = (map1.get(details.getProductSku()));
map1.put(details.getProductSku(), (numbers== null) ? numbers
: numbers.addAll(diohShippingDetails.getSerialNumbers()));
}
解决方案
你的条件(numbers== null) ? numbers: numbers.addAll(diohShippingDetails.getSerialNumbers())
有两个问题。
当数字为
null
时,这是地图为空时的初始状态,它number
用作结果,已被证明为null
,因此结果将始终为null
。addAll
根本不返回一个列表,而是一个boolean
. 您必须将表达式从addAll
操作中生成地图的值。
你可以使用类似的东西
List<String> numbers = map1.get(details.getProductSku());
if(numbers == null) {
numbers = new ArrayList<>();
map1.put(details.getProductSku(), numbers);
}
numbers.addAll(diohShippingDetails.getSerialNumbers());
当map1.get(…)
返回一个 non-null
List
时,我们不需要再放它,但可以向它添加新元素。只有当numbers
is时null
,我们才需要创建一个新列表并将其放入地图中。
或者,您可以使用
Map<String, List<String>> map1 = new HashMap<>();
for(Details details: detailsList) {
map1.computeIfAbsent(details.getProductSku(), key -> new ArrayList<>())
.addAll(diohShippingDetails.getSerialNumbers());
}
computeIfAbsent
如果不存在,将使用指定的函数 ( key -> new ArrayList<>()
) 创建和存储新值。它将返回一个已经存在的列表或刚刚创建和存储的列表。因此,您可以无条件地将元素添加到返回的列表中。
推荐阅读
- android - 无法获取外部文件目录。外部存储状态在 Android 上挂载
- kubernetes - Kubernetes 不允许删除部署 - 服务器找不到请求的资源
- angular - 来自 API 的数据未显示在 Angular html 模板中
- windows - 匹配两个列表并使用 Powershell 查找卸载字符串
- reactjs - 使用单个 onChange 反应钩子处理多个文本字段
- flutter - 如何解决颤振中的 gradle 错误?
- javascript - 仅在用户使用角度、打字稿确认时切换开关
- python - 变量输出导致意外结果
- angular - Angular Universal ssr - 静态预渲染
- html - CSS - 背景颜色在 Safari 中不起作用