首页 > 解决方案 > 将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()));
}

标签: java-8stream

解决方案


你的条件(numbers== null) ? numbers: numbers.addAll(diohShippingDetails.getSerialNumbers())有两个问题。

  1. 当数字为null时,这是地图为空时的初始状态,它number用作结果,已被证明为null,因此结果将始终为null

  2. 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时,我们不需要再放它,但可以向它添加新元素。只有当numbersis时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<>()) 创建和存储新值。它将返回一个已经存在的列表或刚刚创建和存储的列表。因此,您可以无条件地将元素添加到返回的列表中。


推荐阅读