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);
?
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);
?
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ó lý do gì 'map.put (entry.getKey(), entry.getValue())' không đạt yêu cầu? – ajb
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
_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). –