2016-09-11 31 views
13

Czy jest jakiś sposób, że mogę umieścić cały Entry obiektu do Map obiektu jak:Jak umieścić wpis w mapie?

map.put(entry); 

zamiast przekazywać parę klucz-wartość takiego:

map.put(key,value); 

?

+1

Czy istnieje przyczyna, że ​​'map.put (entry.getKey(), entry.getValue())' jest niezadowalająca? – ajb

+4

Ponieważ 'map.put (entry.getKey(), entry.getValue())' jest nadmiarowe i może być zredukowane do samego 'map.put (entry)', które jest bardziej zwięzłe i czytelne. W mojej opinii również powinna istnieć metoda 'V put (Entry )' w interfejsie 'Map'' '' 'java.util'' . – pgmank

+1

_Kiedy potrzebowałbyś takiej metody - jaki byłby przypadek użycia? Myślę, że to nie jest w API, ponieważ [YAGNI] (https://en.wikipedia.org/wiki/You_aren%27t_gonna_need_it). –

Odpowiedz

3

Szukałem na metodach interfejsu mapy, ale nie ma metody, która bierze wpis i umieszcza go na mapie. Dlatego też zaimplementowałam go samodzielnie przy użyciu odrobiny dziedziczenia i interfejsów 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> {} 
} 

Interfejs MyMap jest po prostu interfejs obejmuje interfejs Map przez dodanie jednej metody, public default V put(Entry<K,V> entry). Oprócz samego zdefiniowania metody domyślna implementacja jest również kodowana . Dzięki temu możemy teraz dodać tę metodę do dowolnej klasy, która implementuje interfejs do interfejsu Map, definiując nową klasę, która implementuje interfejs MyMap i rozszerzając wybraną przez nas klasę implementacji map. Wszystko tego w jednym wierszu! Zostało to wykazane w dolnej części kodu powyżej, gdzie tworzone są dwie klasy , z których każda rozszerza implementacje HashMap i TreeMap .