Java:许多键映射之一

时间:2017-01-24 15:57:55

标签: java java-8

我有一张地图,其中可能包含以下其中一个按键

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

有没有办法让这更容易/更好阅读?不幸的是,地图是这样给出的。

2 个答案:

答案 0 :(得分: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 :(得分:1)

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

return ""; // or throw an exception