java - 重新设计方法以使用 Java 8 Map.computeIfAbsent() 并抛出异常

标签 java java-8

我正在尝试使用 Java 8 修改我的一些方法,使它们更加简洁,我正在尝试慢慢吸收其新功能。

这是一个以添加value为目的的方法到 Map<Key, Set<Value>> .存在三种可能性:

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

实现此行为的代码如下,它不使用 Java 8 功能:

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);
}

我想使用 Java 8 方法缩短此代码,例如 computeIfAbsent .

我可以总结最后一个if-else block ,但我无法通过 key 设置的值的冗余映射到在执行前提条件检查时已经被检索。

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);
}

无论如何我可以将所有这些合并到一条指令中吗?

最佳答案

您可以利用 add(element)如果集合不包含指定的元素,方法将返回 true。如果此调用返回 false,则表示未添加该元素,因为它已经存在。因此,您可以使用:

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");
    }
}

关于java - 重新设计方法以使用 Java 8 Map.computeIfAbsent() 并抛出异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37277814/

相关文章:

java - 将变量名称作为输入并输出其值 - Java

java - 带有 HashMap 的 ListView 只显示一个数据

java - 文件 :inbound-channel-adapter prevent-duplicates ="false" is not working in spring boot application

java - JPA获取实体对象的id

java-8 - 在java流api中指定收集器初始容量的优雅方式

java - 具有不同参数的重载方法的无效方法引用

java - 枚举 toString 上的 ClassCastException

java - Tomcat 9 SSL/TLS - 无法初始化组件错误

Java 8 forEach 只适用于某些?

java - 在流收集器中编写 Java 8 方法引用