Java 8 用java中的重复键合并映射中的数组列表

Java 8 用java中的重复键合并映射中的数组列表,java-8,stream,Java 8,Stream,我在下面的请求中有多个数字[]数组 我想把它们合并成一张地图。如果一个键存在于多个列表中,在这种情况下,我应该合并数组 例如,Map应该是: {60075=[100,200,500,600], 60076=[700,600]} 有人能帮我完成我的要求吗 请求: 我尝试了以下代码,但不起作用: Map<String, List<String>> map1 = new HashMap<String, List<String>>(); for (Det

我在下面的请求中有多个
数字[]
数组

我想把它们合并成一张地图。如果一个键存在于多个列表中,在这种情况下,我应该合并数组

例如,
Map
应该是:

{60075=[100,200,500,600], 60076=[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()));
}
Map map1=newhashmap();
for(详细信息:detailsList){
列表编号=(map1.get(details.getProductSku());
map1.put(details.getProductSku(),(numbers==null)?numbers
:numbers.addAll(diohShippingDetails.getSerialNumbers());
}
您的条件
(数字==null)?numbers:numbers.addAll(diohShippingDetails.getSerialNumbers())
有两个问题

  • 当数字为
    null
    ,这是映射为空时的初始状态时,它使用
    number
    作为结果,该结果已被证明为
    null
    ,因此结果将始终为
    null

  • 根本不返回列表,而是返回一个
    布尔值。必须将表达式与
    addAll
    操作分离,以生成映射值

  • 你可以用像

    List number=map1.get(details.getProductSku());
    如果(数字==null){
    数字=新的ArrayList();
    map1.put(details.getProductSku(),number);
    }
    addAll(diohShippingDetails.getSerialNumbers());
    
    map1.get(…)
    返回一个非
    null
    列表时,我们不需要再次放置它,但可以向其中添加新元素。只有当
    numbers
    null
    时,我们才需要创建一个新列表并将其放入映射中

    或者,您可以使用

    Map map1=newhashmap();
    for(详细信息:detailsList){
    map1.ComputeFabSent(details.getProductSku(),key->new ArrayList())
    .addAll(diohShippingDetails.getSerialNumber());
    }
    
    computeIfAbsent
    将使用指定的函数(
    key->new ArrayList()
    )创建并存储新值(如果不存在)。它将返回一个已经存在的列表或刚刚创建和存储的列表。因此,您可以无条件地将元素添加到返回的列表中。

    尝试以下操作:

    Map=
    details.stream()
    .收集(
    toMap(详细信息::产品SKU,
    d->d.getNumbers()==null?Collections.emptyList():d.getNumbers(),
    (a,b)->Stream.concat(a.Stream(),b.Stream()).collect(toList())
    )
    );
    
    请分享您的attempts@ETO我分享了我的尝试
    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()));
    }