Java 导致重复密钥异常的拆分器,而for循环不存在

Java 导致重复密钥异常的拆分器,而for循环不存在,java,cassandra,java-8,java-stream,Java,Cassandra,Java 8,Java Stream,我正在使用Java8流 当我使用拆分器添加到我的映射时,会出现重复键异常,但使用standard for循环不会引发异常 // This works Map<Integer, String> myMap = new HashMap<>(); for (Row row : result.result()) { myMap.put(row.get(0, Integer.class), null); } // This throws exception myMap =

我正在使用Java8流

当我使用拆分器添加到我的映射时,会出现重复键异常,但使用standard for循环不会引发异常

// This works
Map<Integer, String> myMap = new HashMap<>();
for (Row row : result.result()) {
    myMap.put(row.get(0, Integer.class), null);
}

// This throws exception
myMap = StreamSupport.stream(result.result().spliterator(), true)
    .collect(Collectors.toMap(row -> row.get(0, Integer.class), row -> ""));
//这很管用
Map myMap=newhashmap();
for(行:result.result()){
myMap.put(row.get(0,Integer.class),null);
}
//这引发了异常
myMap=StreamSupport.stream(result.result().spliterator(),true)
.collect(Collectors.toMap(行->行.get(0,Integer.class),行->“”);

如果有任何区别,则结果为Cassandra resultset,行为Cassandra行。

当使用标准for循环时,如果在
映射中放置了已存在的键,则旧值将替换为新值

另一方面,如果多个值映射到同一个键,则两个参数
toMap
收集器会引发异常

为了避免这种情况,您需要提供一个merge函数来处理这种冲突

例如:

myMap = 
    StreamSupport.stream(result.result().spliterator(), true)
                 .collect(Collectors.toMap(row -> row.get(0, Integer.class), 
                                           row -> "",
                                           (v1,v2) -> v2));
这将采用其中一个值,并在发生冲突时忽略另一个值。您可以选择其他合并函数,例如附加两个值:

(v1,v2) -> v1 + ", " + v2

正如Eugene所评论的,结果将按遭遇顺序合并到
地图中。

问题数据示例?您最好创建一个可能将cassandra从问题中排除,并且更一般,因此对问题的未来访问者更有用的模型。此外。。看那里有一行
,我假设有一些SQL。。。如果底层结果没有排序(通常不是),这(以及for循环)可能会在不同的运行中返回不同的结果。但我想OP知道这是卡桑德拉的结果集。键按添加到Cassandra表的日期排序。因此,作为映射键的值不是按数字顺序1,2,3,4。。。它们可以是4,1,3,2,所以没关系