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()));
}