Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sql-server-2005/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 8 如何在使用Java流API复制键时添加映射的内部元素_Java 8_Java Stream_Collectors - Fatal编程技术网

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我会处理它。非常感谢你。