[英]Randomly access map entry given the key in java
我有Map<?, String>
類型的字典。 密鑰類型在運行時未知。 我仍然可以使用字符串來調用get()
,如果存在這樣的元素,則可以正確獲取存儲的對象。
現在,我修改該對象,並將其放回字典中。 理想情況下,我想做這樣的事情:
Map<String, String> hat = new HashMap<>();
hat.put("bunny", "rabbit");
Map<?, String> magicHat = hat;
String trick = magicHat.get("bunny");
if (trick != null) {
trick = "jack".concat(trick);
magicHat.put("bunny", trick);
}
但是,可以理解的是,調用magicHat.put("bunny", trick);
給出以下編譯錯誤: incompatible types: String cannot be converted to CAP#1
。
解決它的一種方法是使用流(或迭代)獲取地圖的條目,然后使用該條目修改值:
Map.Entry<?, String> entry = magicHat.entrySet()
.stream()
.filter(e -> "bunny".equals(e.getKey()))
.findFirst()
.orElse(null);
if (entry != null) {
String trick = "jack".concat(entry.getValue());
entry.setValue(trick);
}
但是,在現實生活中,我受Java 6的約束,無法承受流的舒適性。 遍歷所有條目似乎效率很低。
給定鍵,是否有一種優雅的方法可以隨機訪問地圖中的條目?
感謝您的見解。
您應該將鍵類型設置為Object而不是通配符(?)。 這樣,您不必知道類型。 但是,您應該確保不要在地圖中存儲不同類型的鍵。
Map<String, String> hat = new HashMap<>();
hat.put("bunny", "rabbit");
Map<Object, String> magicHat = new HashMap<>();
hat.forEach(magicHat::put); // Edit: Added this
String trick = magicHat.get("bunny"); // String extends Object
if (trick != null) {
trick = "old".concat(trick);
magicHat.put("bunny", trick);
}
在大多數情況下,解決此問題的方法是改為使用通用類型變量。 這樣,您仍然具有類型安全性,但不必在編譯時知道鍵類型。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.