当我将Maps.uniqueIndex与包含重复值的List一起使用时,
java.lang.IllegalArgumentException: duplicate key: 836
at com.google.common.base.Preconditions.checkArgument(Preconditions.java:115)
Run Code Online (Sandbox Code Playgroud)
被扔了.
我发现这很不方便.我认为它确实有意义,但如果函数需要一个唯一的集合才能正常工作,为什么它接受一个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();
}});
Run Code Online (Sandbox Code Playgroud)
简单地在一个普通模型中只有一个键具有多个值是不可能的Map,因此uniqueIndex不能做任何其他事情.
它接受,Iterable因为接受只会Set限制其可能的用法,仍然无法解决问题.并非给定的值Iterable必须是唯一的,而是在每个值上应用给定函数的结果.
如果每个键需要多个值,则可以简单地使用Multimaps.index,它会执行相同但返回a Multimap(每个键可以包含任意数量的值).
我认为让这里的人(包括我,当我不注意时)感到困惑的是,典型的Map(例如HashMap)会悄悄地接受向键写入新值;新值替换旧值,因此如果值也相同,则这是一个静默无操作。Immutable*.Builder 系列在相同情况下会抛出异常。
| 归档时间: |
|
| 查看次数: |
4130 次 |
| 最近记录: |