【问题标题】:Key existence checking utility in MapMap 中的密钥存在检查实用程序
【发布时间】:2012-07-08 04:16:58
【问题描述】:

我正在使用以下代码检查 Map 实例中是否存在密钥:

if (!map_instance.containsKey(key))
    throw new RuntimeException("Specified key doesn't exist in map");
else
   return map_instance.get(key);

我的问题是:

是否有实用程序或Map 实现来简化上述代码,例如:

custom_map.get(key,"Specified key doesn't exist in map");

我的目标是:如果 key 在 map 中不存在,则 map 实现会使用传递的字符串抛出异常。

不知道自己的愿望是否合理?

(对不起,如果我使用了错误的术语或语法,我还在学习英语。)

【问题讨论】:

  • 对您的代码的小提示:return true; 在您的 else 块中而不是 return map_instance.containsKey(key);,该方法的另一个调用是多余的(如果此代码一次仅由一个线程使用)跨度>
  • @Pshemo OP 其实是想这样实现get,所以只是调用的方法名是错误的。
  • @MarkoTopolnik 您可能是对的,但以防万一我留下该评论,以便 OP 可以注意到那里有一些需要改进的地方。

标签: java dictionary hashmap


【解决方案1】:

还有一种更好的方法来实现这一点:

return Objects.requireNonNull(map_instance.get(key), "Specified key doesn't exist in map");

优点:

  • 纯 Java - 无库
  • 没有多余的可选 - 更少的垃圾

缺点:

  • NullPointerException - 有时NoSuchElementException 或自定义异常更可取

需要 Java 8

【讨论】:

    【解决方案2】:

    您可以查看 Apache commons 中的配置图。它没有实现Map,但有一个类似的接口和一些Helper方法,比如getStringgetStringArraygetShort等等。

    通过这个实现,您可以使用方法setThrowExceptionOnMissing(boolean throwExceptionOnMissing) 并且可以捕获它并根据需要进行处理。

    不完全是可配置消息,但从我的角度来看,仅使用自定义消息引发固定异常是没有意义的,因为异常类型本身取决于调用 get 方法的上下文.例如,如果您执行获取用户的异常将与此相关,可能是UserNotFoundException,而不仅仅是带有消息的RuntimeException:用户未在地图中找到!

    【讨论】:

    • 感谢您的回答,您能提供一个示例吗?我不熟悉Apache Common Configuration
    • MapConfiguration mc = new MapConfiguration(properties); mc.setThrowExceptionOnMissing(true); mc.getString("key"); 如果密钥不存在,将抛出 NoSuchElementExcpetion
    【解决方案3】:

    我使用可选的 Java util 类,例如

    Optional.ofNullable(elementMap.get("not valid key"))
                .orElseThrow(() -> new ElementNotFoundException("Element not found"));
    

    【讨论】:

    • 我认为这是最好的解决方案。但最好使用NoSuchElementException
    • 好提议,但是当地图上有一个以 null 为键的条目时它不起作用。因为它会抛出异常而不是返回关联的值。
    • 这完全有效,但是,根据作者的说法,这是对 Optional 数据类型的滥用:stackoverflow.com/a/26328555 Optional 将用作返回类型,而不是作为通过链接进行分支的方式操作代码。
    【解决方案4】:

    在 Java 8 中,您可以使用来自 MapcomputeIfAbsent,如下所示:

    map.computeIfAbsent("invalid", key -> { throw new RuntimeException(key + " not found"); });
    

    【讨论】:

    • 不要这样做。 “computeIfAbsent”是指变异操作。因此,如果您的地图恰好是 UnmodifiableMap、Guava 或 Eclipse Collection ImmutableMap 或 ProtoMap,则此调用将立即失败并出现某种 UnsupportedOperationException。 Java8 等价物可能是:Optional.fromNullable(map.get("invalid")).orElseThrow(() -> new RuntimeException(key + " not found")); 这有点膨胀,但具有正确性的优势。
    • 很棒的评论。但是,当地图上有一个以 null 作为键的条目时,建议的替代方案不起作用,因为它会抛出异常而不是返回关联的值。
    【解决方案5】:

    Java 中的 Map 不存在这样的方法。当然,您可以通过扩展 Map 类或创建包含地图和 tryGet 方法的包装类来创建它。

    C# 确实有这样的方法:Directory.TryGetValue()

    public class MyMap {
        public Map<Object, Object> map = new HashMap<Object, Object>();
    
        public Object tryGet(Object key, String msg) {
            if(!map.containsKey(key))
               throw new IllegalArgumentException(msg);
            return map.get(key); 
       }
    

    【讨论】:

    • 组合优于继承,imo。
    • 组合的不幸的一面是样板的数量令人作呕。
    【解决方案6】:

    你正在做的事情就是要走的路。

    作为旁注,您的代码没有多大意义,因为您将始终返回 true,也许您的意思是:

    return map_instance.get(key);
    

    【讨论】:

    • 是的,我的意思是get 方法调用,我编辑了我的问题。
    猜你喜欢
    • 2018-04-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多