Map中的密钥存在检查实用程序

时间:2012-07-08 13:54:08

标签: java dictionary hashmap

我正在使用以下代码检查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");

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

我不知道我的愿望是否合理?

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

6 个答案:

答案 0 :(得分:18)

在Java 8中,您可以使用Map中的computeIfAbsent,如下所示:

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

答案 1 :(得分:6)

您可以从apache commons here查看配置图。它没有实现Map,但有一些类似的界面,包含一些Helper方法,如getStringgetStringArraygetShort等等。

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

不完全是一个可配置的消息,但从我的观点来看,仅使用自定义消息抛出一个固定的异常是没有意义的,因为异常类型本身取决于get方法的上下文被调用。例如,如果你执行一个用户的获取,那么异常将是与之相关的,可能是UserNotFoundException,而不仅仅是RuntimeException,其中包含以下消息:用户未在地图中找到!

答案 2 :(得分:2)

还有一种更好的方法可以实现此目的:

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

优点:

  • 纯Java-没有库
  • 无冗余可选-减少垃圾

缺点:

  • NullPointerException-有时更希望使用NoSuchElementException或自定义例外

需要Java 8

答案 3 :(得分:1)

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

答案 4 :(得分:0)

你正在做的方式是要走的路。

作为旁注,你的代码没有多大意义,因为你总是会返回true,也许你的意思是:

return map_instance.get(key);

答案 5 :(得分:0)

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

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