Guava Maps.uniqueIndex不允许重复

时间:2014-11-17 14:09:25

标签: guava

当我将Maps.uniqueIndex与包含重复值的List一起使用时,

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();
}});

2 个答案:

答案 0 :(得分:9)

普通Map中的一个键无法使用多个值,因此uniqueIndex无法执行任何操作。

它接受Iterable,因为只接受Set会限制其可能的使用,但仍无法解决问题。并非给定Iterable中的值必须是唯一的,而是对每个值应用给定函数的结果。

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

答案 1 :(得分:4)

我认为让人们感到困惑的是(当我不注意的时候包括我),典型的地图(例如HashMap)会悄悄接受为密钥写一个新值;新值替换旧值,因此如果值也相同,则它是一个无声的无操作。 Immutable * .Builder家族在同样的情况下投掷。