Java 8 如何在使用Java流API复制键时添加映射的内部元素
我有一个这样的Java 8 如何在使用Java流API复制键时添加映射的内部元素,java-8,java-stream,collectors,Java 8,Java Stream,Collectors,我有一个这样的List列表 [ {“A”:50, “B”:100, “C”:200, “D”:“拍卖” }, { “A”:101322143.24, “B”:50243301.2, “C”:569, “D”:“已售出的本票买方” }, { “A”:500, “B”:1000, “C”:1500, “D”:“拍卖” }] 我正在使用这个流API方法将这个列表转换成地图 finalSalesReportForSoldProperty.stream().collect(Collectors.toMa
List
列表
[
{“A”:50,
“B”:100,
“C”:200,
“D”:“拍卖”
},
{
“A”:101322143.24,
“B”:50243301.2,
“C”:569,
“D”:“已售出的本票买方”
},
{
“A”:500,
“B”:1000,
“C”:1500,
“D”:“拍卖”
}]
我正在使用这个流API方法将这个列表转换成地图
finalSalesReportForSoldProperty.stream().collect(Collectors.toMap(tags -> ((String) tags.get("D")).replaceAll("[\\- ]", ""), Function.identity()));
但是它抛出了我的java.lang.IllegalStateException:Duplicate key
异常,因为我的列表有重复的键
我想要添加复制键的内部元素,我想要这样的输出
“拍卖”:{
“A”:550,
“B”:1100,
“C”:1650,
“D”:“拍卖”
} ,
“已售出的本票买方”:{
“A”:101322143.24,
“B”:50243301.2,
“C”:569,
“D”:“已售出的本票买方”
}
可以通过Java流API实现吗?您需要使用收集器的
mergeFunction
参数。对重复的值调用此函数,并将这两个值合并为一个新值
在这种情况下,我们需要通过使用相同的键对值求和来合并两个映射。最简单的解决方案是迭代第二个映射的所有条目,并合并第一个映射中的每个条目。如果映射不存在,将使用正确的值创建映射。如果是,则新值将是两个当前值的总和
现在,假设每个值实际上是一个双精度:
finalSalesReportForSoldProperty.stream().collect(Collectors.toMap(
tags -> ((String) tags.get("assetStatus")).replaceAll("[\\- ]", ""),
Function.identity(),
(m1, m2) -> {
Map<String, Object> map = new HashMap<>(m1);
m2.entrySet().stream()
.filter(e -> e.getValue() instanceof Double)
.forEach(e -> map.merge(e.getKey(), e.getValue(), (o1, o2) -> ((Double) o1) + ((Double) o2)));
return map;
}
));
finalSalesReportForSoldProperty.stream().collect(Collectors.toMap(
tags->((String)tags.get(“assetStatus”).replaceAll(“[\\-]”,“”),
Function.identity(),
(m1,m2)->{
Map Map=新的HashMap(m1);
m2.entrySet().stream()
.filter(e->e.getValue()实例为双精度)
.forEach(e->map.merge(e.getKey(),e.getValue(),(o1,o2)->(Double)o1)+(Double)o2));
返回图;
}
));
值的类型为对象
。你是如何定义加法的?或者我们可以假设它是Double
?@Tunaki类型的值是Object,所以我只放字符串和Double值。我想把“D”的值作为键,应该为重复的值添加rest元素。是的,我们可以假设它是一个double,它会添加所有元素吗。?我不想添加“D”的值,因为这是字符串,需要相同的值。我们可以设置任何条件来避免使用过滤器或其他东西吗?@SonuGupta是的,您可以添加一个过滤器来仅过滤双值。我编辑了。出现了一些问题,没有添加值。@SonuGupta那么这是因为您的值不是双精度的(
:)映射应该是“A”:50.0,
,才能有双精度的值。我猜是整数和双精度的混合。好的@Tunki我会处理它。非常感谢你。