39

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地图中不存在,则地图实现会使用传递的字符串引发异常。

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

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

4

6 回答 6

47

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

Optional.ofNullable(elementMap.get("not valid key"))
            .orElseThrow(() -> new ElementNotFoundException("Element not found"));
于 2019-05-29T11:53:36.650 回答
24

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

map.computeIfAbsent("invalid", key -> { throw new RuntimeException(key + " not found"); });
于 2017-06-22T12:13:09.883 回答
17

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

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

优点:

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

缺点:

  • only NullPointerException- 有时NoSuchElementException或自定义例外更可取

需要 Java 8

于 2020-05-09T19:17:07.760 回答
7

您可以查看来自 Apache commons 的配置图。它没有实现Map,但具有类似的接口,带有一些 Helper 方法,例如getString,getStringArraygetShort

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

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

于 2012-07-08T14:07:28.917 回答
2

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); 
   }
于 2012-07-08T14:00:20.077 回答
0

你这样做的方式就是要走的路。

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

return map_instance.get(key);
于 2012-07-08T13:58:10.673 回答