Java:一个键对应多个值的映射

7

我有一个地图,其中可能包含以下关键字之一

Map<String, String> map = getMap();

我现在想要检查一些键中是否有一个被设置。我的当前方法是链式调用多个map.getOrDefault(...)

Address address = new Address();
address.setStreet(map.getOrDefault("STORE_STREET"
    , map.getOrDefault("OFFICE_STREET", ...));

或者检查每个键是否存在于映射中。

if(map.containsKey("STORE_STREET")){
   address.setStreet(map.get("STORE_STREET"));
}else if(map.containsKey("OFFICE_STREET")){
   address.setStreet(map.get("OFFICE_STREET"));
}

有没有什么方法可以使这个更容易/更好地阅读?不幸的是,地图就是这样给出的。


所以,您想遍历地图中的不同键,并找到并使用第一个设置的键? - Adowrath
对我来说,address.setStreet(map.getOrDefault("STORE_STREET" , map.getOrDefault("OFFICE_STREET", ...)); 看起来是最佳选择。 - VHS
有没有一个字符串集合,例如“store_street”等,然后循环遍历它们,同时检查containsKey并将它们设置在地址对象中? - Exception_al
@Adowrath 是的,确切地说。 - David
@Exception_al 看起来对我来说更加复杂。 - David
2个回答

12

通常来说,getOrDefault是首选方法,但如果你有多个备选键,这不仅会影响可读性,还会将性能优势变成相反的方向。例如:

address.setStreet(map.getOrDefault("STORE_STREET", map.getOrDefault("OFFICE_STREET", ...));

在查找主键(或优先级更高的键)是否存在之前,首先查找备用键以获取回退值。

一个解决方案是

Stream.of("STORE_STREET", "OFFICE_STREET", ...)
      .map(map::get)
      .filter(Objects::nonNull)
      .findFirst()
      .ifPresent(address::setStreet);

如果只执行一次,由于初始化开销较高,性能可能低于简单循环,但这时性能差异将是无关紧要的。对于频繁执行的情况,几乎没有显著差异,所以你应该基于可读性来做出决策(当然,这是主观的)。


1
String []keys = {"STORE_STREET", "OFFICE_STREET", ...};
for (String k : keys)
{
   if (map.containsKey(k))
     return map.get(k);
}

return ""; // or throw an exception

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接