2017-01-24 12 views
6

tôi nhận được một bản đồ, có thể chứa một trong những phím sauJava: một trong nhiều phím map

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

bây giờ tôi muốn kiểm tra nếu một trong một số phím được thiết lập. Cách tiếp cận hiện tại của tôi là chuỗi nhiều map.getOrDefault(...)

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

hoặc kiểm tra từng phím nếu nó tồn tại trên bản đồ.

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

Có cách nào để giúp việc đọc này dễ đọc hơn không? Thật không may là bản đồ được đưa ra như vậy.

+0

Vì vậy, bạn muốn đi qua các phím khác nhau trong bản đồ và tìm và sử dụng khóa đầu tiên được đặt? – Adowrath

+0

'address.setStreet (map.getOrDefault (" STORE_STREET " , map.getOrDefault (" OFFICE_STREET ", ...));' trông tối ưu với tôi. – VHS

+0

Cách có bộ sưu tập các chuỗi như "store_street", v.v. looping thông qua chúng trong khi kiểm tra cho containsKey và sau đó thiết lập chúng trong đối tượng địa chỉ? –

Trả lời

11

Thông thường, getOrDefault sẽ là con đường để đi, nhưng nếu bạn có nhiều phím thay thế, điều này không chỉ ảnh hưởng đến khả năng đọc, mà còn biến lợi thế hiệu suất vào điều ngược lại. Với mã như:

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

bạn đang tìm kiếm lên các phím thay thế đầu tiên, để có được giá trị sụt giảm trở lại, ngay cả trước khi nhìn dù khóa chính (hoặc một phím với một ưu tiên cao hơn) có mặt.

Về xử lý sẽ được

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

Khi thực hiện điều này một lần duy nhất, hiệu quả của nó có thể ít hơn một vòng lặp đơn giản, do chi phí khởi tạo cao hơn, tuy nhiên, sự khác biệt hiệu suất sẽ không thích hợp rồi. Để thực hiện thường xuyên, sẽ không có sự khác biệt đáng kể, vì vậy bạn nên quyết định dựa trên khả năng đọc (đó là chủ quan, tất nhiên).

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

return ""; // or throw an exception 
Các vấn đề liên quan