2014-11-17 53 views
1

当我使用Maps.uniqueIndex与包含重复值的列表,番石榴Maps.uniqueIndex不允许重复

java.lang.IllegalArgumentException: duplicate key: 836 
at com.google.common.base.Preconditions.checkArgument(Preconditions.java:115) 

被抛出。

我觉得这很不方便。我认为它确实有道理,但是如果函数需要唯一的集合才能正确工作,为什么它接受一个I​​terable作为参数而不是Set?

List<GroupVO> groups = groupDao.getAll(groupIds); 

Map<String,GroupVO> groupMap groupMap = Maps.uniqueIndex(groups, new Function<GroupVO,String>() { 
    public String apply(GroupVO vo) { 
     return vo.getId().toString(); 
}}); 

回答

7

这是根本不可能在一个普通的Map一个键多个值,从而uniqueIndex不能做任何事情。

它接受Iterable,因为只接受Set将限制其可能的用法,仍然不能解决问题。不是给定的Iterable中的值必须是唯一的,而是在每个值上应用给定函数的结果。

如果您需要每个键的多个值,您可以简单地使用Multimaps.index,它会做相同的操作,但会返回Multimap(每个键可包含任意数量的值)。

+1

我希望有一个这个函数的版本,只是悄悄地覆盖而不是抛出异常。刚发生意外情况时再次被咬伤。似乎需要进行检查以确保此功能不会意外失败,而不是消除其优势(在我的情况下) – Marc

3

我认为在这里(包括我在我不注意的时候)让人感到困惑的是典型的Maps(例如HashMap)会悄悄地接受为一个键写新的值;新值取代了旧值,所以如果值也相同,则它是无声的无操作。 Immutable * .Builder系列在相同情况下抛出。