我正在使用以下代码检查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
,则地图实现会使用传递的字符串抛出异常。
我不知道我的愿望是否合理?
(对不起,如果我使用错误的术语或语法,我仍在学习英语。)
答案 0 :(得分:18)
在Java 8中,您可以使用Map
中的computeIfAbsent
,如下所示:
map.computeIfAbsent("invalid", key -> { throw new RuntimeException(key + " not found"); });
答案 1 :(得分:6)
您可以从apache commons here查看配置图。它没有实现Map
,但有一些类似的界面,包含一些Helper方法,如getString
,getStringArray
,getShort
等等。
通过此实现,您可以使用方法setThrowExceptionOnMissing(boolean throwExceptionOnMissing)
并可以捕获它并根据需要进行处理。
不完全是一个可配置的消息,但从我的观点来看,仅使用自定义消息抛出一个固定的异常是没有意义的,因为异常类型本身取决于get
方法的上下文被调用。例如,如果你执行一个用户的获取,那么异常将是与之相关的,可能是UserNotFoundException
,而不仅仅是RuntimeException
,其中包含以下消息:用户未在地图中找到!
答案 2 :(得分:2)
还有一种更好的方法可以实现此目的:
return Objects.requireNonNull(map_instance.get(key), "Specified key doesn't exist in map");
优点:
缺点:
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"));