加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

java – 检查不可变映射构建器中的值(列表)是否存在

发布时间:2020-12-15 04:35:22 所属栏目:Java 来源:网络整理
导读:我有一个像这样定义的地图: MapString,ListSomeClass map = new HashMap(); 我认为通过使用ImmutableMap.Builder构造使它成为不可变是很好的. 但在我的情况下,当在地图中放置新元素时,我需要首先检查它们的存在,如果给定键的列表不存在,则创建它并向其添加
我有一个像这样定义的地图:

Map<String,List<SomeClass>> map = new HashMap<>();

我认为通过使用ImmutableMap.Builder构造使它成为不可变是很好的.
但在我的情况下,当在地图中放置新元素时,我需要首先检查它们的存在,如果给定键的列表不存在,则创建它并向其添加元素:

for(final SomeClass elem : elements){
    final String key = elem.getKey();
    if(!map.containsKey(target)){
        map.put(key,new LinkedList<SomeClass>());
    }
    map.get(key).add(elem);
}

如果map中有目标键,我需要创建分配给它的新列表,然后将元素添加到该列表中.

是否有任何方法可以使该映射不可变,而不使用不必要的代码,如更多循环首先初始化目标键的列表?

顺便说一句.我正在使用Java 7

解决方法

你应该在这里使用 ListMultimap.使用 ImmutableListMultimap.builder()

ImmutableListMultimap.Builder<String,SomeClass> builder = ImmutableListMultimap.builder();
for (final SomeClass elem : elements) {
    final String key = elem.getKey();
    builder.put(key,elem);
}
ImmutableListMultimap<String,SomeClass> multimap = builder.build();

可是等等!有用于您的用例的内置方法 – Multimaps#index(Iterable,Function)

ImmutableListMultimap<String,SomeClass> multimap = Multimaps.index(
    elements,new Function<SomeClass,String>() {
        @Override public String apply(final SomeClass element) {
            return element.getKey();
        }
    });

(在Java 8中):

ImmutableListMultimap<String,SomeClass> multimap =
    Multimaps.index(elements,SomeClass::getKey);

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读