2016-09-11 13 views
13

Có cách nào mà tôi có thể đặt một đối tượng toàn Entry đến một đối tượng Map như:Làm thế nào để đặt một Entry vào một bản đồ?

map.put(entry); 

thay vì đi qua một cặp khóa-giá trị như:

map.put(key,value); 

?

+1

Có lý do gì 'map.put (entry.getKey(), entry.getValue())' không đạt yêu cầu? – ajb

+4

Bởi vì 'map.put (entry.getKey(), entry.getValue())' là thừa và có thể là giảm xuống chỉ 'map.put (entry)' là ngắn gọn và dễ đọc hơn. Trong ý kiến ​​ của tôi cũng có, nên có một phương pháp 'V đặt (nhập )' trong giao diện 'Map2 'của giao diện' java.util'. – pgmank

+1

_When_ bạn sẽ cần phương thức như vậy - trường hợp sử dụng là gì? Tôi nghĩ nó không có trong API, vì [YAGNI] (https://en.wikipedia.org/wiki/You_aren%27t_gonna_need_it). –

Trả lời

3

Tôi đã tìm kiếm trên các phương thức giao diện Bản đồ nhưng không có phương pháp nào nhận một mục nhập và đưa nó vào bản đồ. Do đó, tôi đã tự mình triển khai bằng cách sử dụng một chút giao diện kế thừa và Java 8.

import java.util.AbstractMap; 
import java.util.HashMap; 
import java.util.Map; 
import java.util.TreeMap; 

public class Maps { 

    // Test method 
    public static void main(String[] args) { 
     Map.Entry<String, String> entry1 = newEntry("Key1", "Value1"); 
     Map.Entry<String, String> entry2 = newEntry("Key2", "Value2"); 

     System.out.println("HashMap"); 
     MyMap<String, String> hashMap = new MyHashMap<>(); 
     hashMap.put(entry1); 
     hashMap.put(entry2); 

     for (String key : hashMap.keySet()) { 
      System.out.println(key + " = " + hashMap.get(key)); 
     } 

     System.out.println("\nTreeMap"); 
     MyMap<String, String> treeMap = new MyTreeMap<>(); 
     treeMap.put(entry1); 
     treeMap.put(entry2); 


     for (String key : treeMap.keySet()) { 
      System.out.println(key + " = " + treeMap.get(key)); 
     } 
    } 


    /** 
    * Creates a new Entry object given a key-value pair. 
    * This is just a helper method for concisely creating a new Entry. 
    * @param key key of the entry 
    * @param value value of the entry 
    * 
    * @return the Entry object containing the given key-value pair 
    */ 
    private static <K,V> Map.Entry<K,V> newEntry(K key, V value) { 
     return new AbstractMap.SimpleEntry<>(key, value); 
    } 

    /** 
    * An enhanced Map interface. 
    */ 
    public static interface MyMap<K,V> extends Map<K,V> { 

     /** 
     * Puts a whole entry containing a key-value pair to the map. 
     * @param entry 
     */ 
     public default V put(Entry<K,V> entry) { 
      return put(entry.getKey(), entry.getValue()); 
     } 
    } 

    /** 
    * An enhanced HashMap class. 
    */ 
    public static class MyHashMap<K,V> extends HashMap<K,V> implements MyMap<K,V> {} 

    /** 
    * An enhanced TreeMap class. 
    */ 
    public static class MyTreeMap<K,V> extends TreeMap<K,V> implements MyMap<K,V> {} 
} 

Giao diện MyMap chỉ là một giao diện mở rộng giao diện Map bằng cách thêm một phương pháp hơn, public default V put(Entry<K,V> entry). Ngoài việc chỉ định phương thức, triển khai mặc định cũng được mã hóa . Làm như vậy, bây giờ chúng ta có thể thêm phương thức này vào bất kỳ lớp nào thực hiện giao diện Map chỉ bằng cách xác định một lớp mới thực hiện giao diện MyMap và mở rộng lớp triển khai bản đồ mà chúng tôi chọn. Tất cả trong số đó trong một dòng! Điều này được thể hiện ở dưới cùng của mã ở trên, nơi hai lớp được tạo ra mỗi khi mở rộng HashMap và triển khai TreeMap .

Các vấn đề liên quan