Map<String, String> phoneBook = people.stream()
                                      .collect(toMap(Person::getName,
                                                     Person::getAddress));

我得到java.lang.IllegalStateException:当找到一个重复的元素时,重复键。

是否有可能忽略这种例外添加值到地图?

当有重复的键时,应该忽略重复的键继续执行。


当前回答

可以使用lambda函数:比较从key(…)到键字符串

List<Blog> blogsNoDuplicates = blogs.stream()
            .collect(toMap(b->key(b), b->b, (b1, b2) -> b1))  // b.getAuthor() <~>key(b) as Key criteria for Duplicate elimination
            .values().stream().collect(Collectors.toList());

static String key(Blog b){
    return b.getTitle()+b.getAuthor(); // make key as criteria of distinction
}

其他回答

按对象分组

Map<Integer, Data> dataMap = dataList.stream().collect(Collectors.toMap(Data::getId, data-> data, (data1, data2)-> {LOG.info("Duplicate Group For :" + data2.getId());return data1;}));

可以使用lambda函数:比较从key(…)到键字符串

List<Blog> blogsNoDuplicates = blogs.stream()
            .collect(toMap(b->key(b), b->b, (b1, b2) -> b1))  // b.getAuthor() <~>key(b) as Key criteria for Duplicate elimination
            .values().stream().collect(Collectors.toList());

static String key(Blog b){
    return b.getTitle()+b.getAuthor(); // make key as criteria of distinction
}

我有同样的情况,发现最简单的解决方案(假设你只是想覆盖重复键的映射值)是:

Map<String, String> phoneBook = 
       people.stream()
           .collect(Collectors.toMap(Person::getName, 
                                  Person::getAddress, 
                                        (key1, key2)-> key2));

对于其他遇到此问题但没有在映射流中重复键的人,请确保keyMapper函数不返回空值。

跟踪这个是非常烦人的,因为当它处理第二个元素时,Exception会说“重复键1”,而1实际上是条目的值而不是键。

在我的情况下,我的keyMapper函数试图在不同的映射中查找值,但由于字符串中的错别字返回空值。

final Map<String, String> doop = new HashMap<>();
doop.put("a", "1");
doop.put("b", "2");

final Map<String, String> lookup = new HashMap<>();
doop.put("c", "e");
doop.put("d", "f");

doop.entrySet().stream().collect(Collectors.toMap(e -> lookup.get(e.getKey()), e -> e.getValue()));

我在分组对象时遇到过这样的问题,我总是用一个简单的方法解决它们:使用java.util.Set执行一个自定义过滤器,以删除重复的对象,无论你选择的属性如下所示

Set<String> uniqueNames = new HashSet<>();
Map<String, String> phoneBook = people
                  .stream()
                  .filter(person -> person != null && !uniqueNames.add(person.getName()))
                  .collect(toMap(Person::getName, Person::getAddress));

希望这对有同样问题的人有所帮助!