重新设计方法以将Java 8 Map.computeIfAbsent()与抛出的异常一起使用

达巴达巴

我正在尝试使用Java 8重做我的一些方法,以使其更加简洁,我正在尝试逐渐吸收其新功能。

这是一种将a添加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块,但是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");
    }
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类常见问题

使用Java 8 Streams的Hash Map对象列表迭代

来自分类常见问题

Java 8 Map中的putIfAbsent和computeIfAbsent有什么区别?

来自分类Dev

如何将Java 8流与InputStream一起使用?

来自分类Dev

将Jackson ObjectMapper与Java 8可选值一起使用

来自分类Dev

使用go,如何将map [int] T转换为map [string] T以与JSON一起使用?

来自分类Dev

如何将Google Map与聚合物一起使用?

来自分类Dev

我应该将java Stream.map函数与switch语句一起使用吗?

来自分类Dev

将Google Map与Java Swing应用程序一起使用?

来自分类Dev

Java 8,将Nashorn与Java 8 Compact Profiles一起使用

来自分类Dev

将Web代理与Java 8 JAX-RS RESTEasy客户端一起使用

来自分类Dev

如何使用bluebird将原始数据与Promise.map的响应一起传递?

来自分类Dev

将Map与mget一起使用会产生意外的输出

来自分类Dev

java 8可选map()使用函数引用但不使用完整的lambda语法抛出NPE

来自分类Dev

将Datastax Cassandra ResultSet与Java 8并行流一起使用-快速

来自分类Dev

Map上的Java 8流

来自分类Dev

如何将map与需要更多参数的函数一起使用

来自分类Dev

如何从dask.distrubuting(Python库)将Future与Executor的map方法一起使用?

来自分类Dev

使用map2_dfr将数据的bind_cols在一起

来自分类Dev

如map所支持的,如何将filter与多个可迭代对象一起使用?

来自分类Dev

如何将Google Map与聚合物一起使用?

来自分类Dev

如何将g:render与Map集合中的g:each变量一起使用?

来自分类Dev

当将Image map与ImageMapster jQuery插件一起使用时,坐标会更改

来自分类Dev

将Google Map与Java Swing应用程序一起使用?

来自分类Dev

我如何将Iterator的#map与生锈的#fold一起使用?

来自分类Dev

Python:将str.ljust与map一起使用

来自分类Dev

Java8:使用RxJava将Map <X,Y>映射到Map <X,Z>

来自分类Dev

将Java 8 Stream与ObjectMapper readValue方法一起使用

来自分类Dev

在 Java 8 中使用 map 函数无法进行类型转换

来自分类Dev

使用 Java 8 将 Map<Object,Map<Object,List<Object>>> 转换为 Set<Object>

Related 相关文章

  1. 1

    使用Java 8 Streams的Hash Map对象列表迭代

  2. 2

    Java 8 Map中的putIfAbsent和computeIfAbsent有什么区别?

  3. 3

    如何将Java 8流与InputStream一起使用?

  4. 4

    将Jackson ObjectMapper与Java 8可选值一起使用

  5. 5

    使用go,如何将map [int] T转换为map [string] T以与JSON一起使用?

  6. 6

    如何将Google Map与聚合物一起使用?

  7. 7

    我应该将java Stream.map函数与switch语句一起使用吗?

  8. 8

    将Google Map与Java Swing应用程序一起使用?

  9. 9

    Java 8,将Nashorn与Java 8 Compact Profiles一起使用

  10. 10

    将Web代理与Java 8 JAX-RS RESTEasy客户端一起使用

  11. 11

    如何使用bluebird将原始数据与Promise.map的响应一起传递?

  12. 12

    将Map与mget一起使用会产生意外的输出

  13. 13

    java 8可选map()使用函数引用但不使用完整的lambda语法抛出NPE

  14. 14

    将Datastax Cassandra ResultSet与Java 8并行流一起使用-快速

  15. 15

    Map上的Java 8流

  16. 16

    如何将map与需要更多参数的函数一起使用

  17. 17

    如何从dask.distrubuting(Python库)将Future与Executor的map方法一起使用?

  18. 18

    使用map2_dfr将数据的bind_cols在一起

  19. 19

    如map所支持的,如何将filter与多个可迭代对象一起使用?

  20. 20

    如何将Google Map与聚合物一起使用?

  21. 21

    如何将g:render与Map集合中的g:each变量一起使用?

  22. 22

    当将Image map与ImageMapster jQuery插件一起使用时,坐标会更改

  23. 23

    将Google Map与Java Swing应用程序一起使用?

  24. 24

    我如何将Iterator的#map与生锈的#fold一起使用?

  25. 25

    Python:将str.ljust与map一起使用

  26. 26

    Java8:使用RxJava将Map <X,Y>映射到Map <X,Z>

  27. 27

    将Java 8 Stream与ObjectMapper readValue方法一起使用

  28. 28

    在 Java 8 中使用 map 函数无法进行类型转换

  29. 29

    使用 Java 8 将 Map<Object,Map<Object,List<Object>>> 转换为 Set<Object>

热门标签

归档