首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在Java8函数样式中,如何将值映射到已经存在的键值对

在Java8函数样式中,如何将值映射到已经存在的键值对
EN

Stack Overflow用户
提问于 2015-12-01 13:29:41
回答 4查看 2.5K关注 0票数 21

我有一张地图:

代码语言:javascript
复制
Map<String, List<Object>> dataMap;

现在,我想将新的键值对添加到地图中,如下所示:

代码语言:javascript
复制
if(dataMap.contains(key)) {
    List<Object> list = dataMap.get(key);
    list.add(someNewObject);
    dataMap.put(key, list);
} else {
    List<Object> list = new ArrayList();
    list.add(someNewObject)
    dataMap.put(key, list);
}

我如何使用Java8功能风格来完成这个任务?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2015-12-01 13:54:08

您可以使用computeIfAbsent

如果不存在映射,只需通过将键与新的空列表相关联来创建映射,然后将值添加到其中。

代码语言:javascript
复制
dataMap.computeIfAbsent(key, k -> new ArrayList<>()).add(someNewObject);

如文档所述,它返回与指定键关联的当前(现有的或计算的)值,以便您可以使用ArrayList#add链接调用。当然,这假定原始地图中的值不是固定大小的列表(我不知道您是如何填充的).

顺便说一句,如果您能够访问原始数据源,我将从它获取流并直接使用Collectors.groupingBy

票数 32
EN

Stack Overflow用户

发布于 2015-12-01 13:39:09

这可以通过使用三元运算符来简化。你真的不需要if-else语句

代码语言:javascript
复制
List<Object> list = dataMap.containsKey(key) ?  dataMap.get(key) : new ArrayList<>();
list.add(someNewObject);
dataMap.put(key, list);
票数 1
EN

Stack Overflow用户

发布于 2019-02-22 18:26:06

您还可以使用compute方法。

代码语言:javascript
复制
dataMap.compute(key, (k, v) -> {
                              if(v == null)
                                  return new ArrayList<>();
                              else {
                                   v.add(someNewObject);
                                   return v;
                              }
                         });
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34021652

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档