繁体   English   中英

地图中的关键存在检查实用程序

[英]Key existence checking utility in Map

我正在使用以下代码检查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 实现会抛出传递的字符串异常。

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

(抱歉,如果我使用了错误的术语或语法,我仍在学习英语。)

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

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

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

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

优点:

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

缺点:

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

需要 Java 8

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

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

您可以查看来自 Apache commons 的配置映射。 它不实现Map ,但具有与一些 Helper 方法类似的接口,如getStringgetStringArraygetShort等。

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

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

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

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

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

return map_instance.get(key);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM