Guava Maps.uniqueIndex不允许重复

Mar*_*arc 1 guava

当我将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)

被扔了.

我发现这很不方便.我认为它确实有意义,但如果函数需要一个唯一的集合才能正常工作,为什么它接受一个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();
}});
Run Code Online (Sandbox Code Playgroud)

Phi*_*ler 9

简单地在一个普通模型中只有一个键具有多个值是不可能的Map,因此uniqueIndex不能做任何其他事情.

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

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

  • 我希望这个函数有一个版本可以悄悄地覆盖而不是抛出异常。刚刚又被咬了,发生了意想不到的情况。看来为确保此功能不会意外失败而进行的检查不仅消除了它的优点(就我而言) (2认同)

iso*_*eme 5

我认为让这里的人(包括我,当我不注意时)感到困惑的是,典型的Map(例如HashMap)会悄悄地接受向键写入新值;新值替换旧值,因此如果值也相同,则这是一个静默无操作。Immutable*.Builder 系列在相同情况下会抛出异常。