2017-01-24 31 views
6

我得到了一个地图,其中可能包含以下键的Java:很多关键之一映射

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

有什么办法可以让这个更容易/更好的阅读吗?不幸的是,地图是这样给出的。

+0

那么,你想通过地图中的不同键并找到并使用设置的第一个键? – Adowrath

+0

'address.setStreet(map.getOrDefault(“STORE_STREET” ,map.getOrDefault(“OFFICE_STREET”,...));'看起来最适合我 – VHS

+0

如何获得像“store_street”等字符串集合,以及在检查containsKey并在地址对象中设置它们时循环遍历它们? –

回答

11

通常情况下,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