当我将Maps.uniqueIndex与包含重复值的List一起使用时,
java.lang.IllegalArgumentException: duplicate key: 836
at com.google.common.base.Preconditions.checkArgument(Preconditions.java:115)
被抛出。
我发现这很不方便。我认为它确实有道理,但如果函数需要一个唯一的集合才能正常工作,为什么它接受一个Iterable作为参数而不是一个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();
}});
答案 0 :(得分:9)
普通Map
中的一个键无法使用多个值,因此uniqueIndex
无法执行任何操作。
它接受Iterable
,因为只接受Set
会限制其可能的使用,但仍无法解决问题。并非给定Iterable
中的值必须是唯一的,而是对每个值应用给定函数的结果。
如果每个键需要多个值,则只需使用Multimaps.index
,它会执行相同操作但返回Multimap
(每个键可以包含任意数量的值)。
答案 1 :(得分:4)
我认为让人们感到困惑的是(当我不注意的时候包括我),典型的地图(例如HashMap)会悄悄接受为密钥写一个新值;新值替换旧值,因此如果值也相同,则它是一个无声的无操作。 Immutable * .Builder家族在同样的情况下投掷。