先说明一下我使用这个方法的场景。我有一个User对象的list集合,需要提取其中的id作为map集合的key,name作为map集合value,(其实就是将所有user对象的id和name放到一个map集合中)具体如下:
Listlist = new ArrayList<>(); // ... 此处省略向list集合中添加User对象 Map map = list.stream().collect(Collectors.toMap(User::getId,User::getName));
这个时候出现了错误“java.lang.IllegalStateException: Duplicate key xxx”,本来我想的是id作为key,如果出现重复那么就合并留一个就行,但是代码提示出现了这个错误。
错误异常原因查找了错误的异常的原因,查看源码发现,这个Collectors.toMap使用了Map集合的merge方法,本来这个方法是没有问题的,关键是Collectors.toMap这个方法里面写了这个异常,如果你写入的值有重复就会出现异常。
也就是说,只要你的key(这里是user的id)出现重复,就会爆出这个异常。不过这个Collectors的toMap也有其他的重载方法,可以使用重载的避免这个问题。如下:
Listlist = new ArrayList<>(); // ... 此处省略向list集合中添加User对象 Map map = list.stream().collect(Collectors.toMap(User::getId,User::getName,(oldValue,newValue)->newValue)); //最后的使用需要参考Map集合的merge方法的使用



