首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >使用Java 8 Map.computeIfAbsent()重新设计抛出异常的方法

使用Java 8 Map.computeIfAbsent()重新设计抛出异常的方法
EN

Stack Overflow用户
提问于 2016-05-17 13:38:30
回答 1查看 13.4K关注 0票数 12

我正在尝试重新设计我的一些方法,以便使用Java 8使它们更加简洁,我正试图慢慢地吸收它的新特性。

它是一种将value添加到Map<Key, Set<Value>>中的方法。有三种可能性:

  1. 键不存在:它被添加,一个包含值的新集合被关联到它。
  2. 键存在:值被添加到现有的集合中。注意,集合永远不会是null,因为我有一些先决条件来处理这个问题。
  3. 键存在,并且该值已经包含在集合中:抛出一个IllegalArgumentException

实现此行为的代码如下所示,它不使用Java 8特性:

代码语言:javascript
运行
复制
public void addValue(Key key, Value value) {
    // irrelevant preconditions...

    Set<Value> valuesForKey = myMap.get(key);
    if (valuesForKey != null && valuesForKey.contains(value))
        throw new IllegalArgumentException("Association exists already");

    if (valuesForKey == null)
        myMap.put(key, new HashSet<Value>(Arrays.asList(value)));
    else
        valuesForKey.add(value);
}

我想使用像computeIfAbsent这样的Java 8方法来缩短这段代码。

我可以总结最后一个if-else块,但是我无法克服key映射到的在执行先决条件检查时已经被检索到的值集的冗余。

代码语言:javascript
运行
复制
public void addValue(Key key, Value value) {
    // irrelevant preconditions...

    Set<Value> valuesForKey = myMap.get(key);
    if (valuesForKey != null && valuesForKey.contains(value))
        throw new IllegalArgumentException("Association exists already");

    myMap.computeIfAbsent(key, v -> new HashSet<Value>()).add(value);
}

不管怎么说,我可以把所有这些合并在一条指令里吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-05-17 13:44:21

您可以利用这样的事实:如果集合不包含指定的元素,add(element)方法将返回true。如果这个调用返回false,这意味着元素没有被添加,因为它已经存在。因此,您可以使用:

代码语言:javascript
运行
复制
public void addValue(Key key, Value value) {
    boolean added = myMap.computeIfAbsent(key, k -> new HashSet<>()).add(value);
    if (!added) {
        throw new IllegalArgumentException("Association exists already");
    }
}
票数 11
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37277814

复制
相关文章

相似问题

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