2015-01-17 33 views
6

我有以下幾點:如何將Java 8 map.remove轉換爲Java 1.6?

 fruitMap.remove(fruitId, fruitProperties); 

的fruitMap是:

private Map<FruitId, FruitProperties> fruitMap = new HashMap<FruitId, FruitProperties>(); 

當我嘗試建立我的代碼,我得到一個:

ERROR 
The method remove(Object) in the type Map<MyImplementation.FruitId, FruitProperties> 
is not applicable for the arguments (Map<MyImplementation.FruitId, FruitProperties>) 

問題是什麼?

請注意,thiis調用是在我的「FruitImplementation」類中的一個方法「removeFruit()」中。

+0

如何定義'fruitId'? – Todd

回答

2

remove(key, value)方法將刪除key的條目(如果它當前映射到value)。該方法在Java 1.8中添加。對於Map接口的Javadoc提到了以下默認的實現:

if (map.containsKey(key) && Objects.equals(map.get(key), value)) { 
    map.put(key, newValue); 
    return true; 
} else 
    return false; 

由於Objects類是用Java 1.7只加了,對Java 1.6,你必須寫平等測試自己。所以,如果你不需要的方法的返回值,你可以替換map.remove(key, value)有:

if (map.containsKey(key) { 
    Object storedValue = map.get(key); 
    if (storedValue == null ? value == null : storedValue.equals(value)) { 
     map.remove(key); 
    } 
} 

請注意,這不是線程安全的。如果您從多個線程訪問地圖,則必須添加一個同步塊。

2

你必須自己測試的數值:

if(fruitProperties.equals(fruitMap.get(fruitId)) { 
    fruitMap.remove(fruitId); 
} 

注意,我在這裏實現假定你正在測試一個非空fruitProperties對象。

7

the Javadocs

默認實現等效於,對於此映射:

if (map.containsKey(key) && Objects.equals(map.get(key), value)) { 
    map.remove(key); 
    return true; 
} else 
    return false; 

缺省的實現有關此方法的同步或原子性質沒有保證。提供原子性保證的任何實現都必須重寫此方法並記錄其併發性屬性。

因此,您可以使用該默認實現。也許把它放在一個靜態的輔助方法中。

但是,如果這應該是線程安全的,則可能需要添加一些同步代碼(或者考慮使用ConcurrentMap,它自從Java 5以來已經具有remove方法)。

+2

Java 6沒有'Objects'類。 –

+3

啊..我會把這個作爲練習留給讀者。 :-) – Thilo

+0

我認爲它必須同步?你如何避免沒有一個對象類?我不確定是否需要,我想保留這種風格的代碼而不會破壞任何東西。 – Rolando

1

你需要做以下假設你的價值觀不能null

if (fruitProperties.equals(fruitMap.get(fruitId)) 
    fruitMap.remove(fruitId); 

注意:這是線程安全的,你需要在​​塊這個包起來。

1

這裏是完整的解決方案,處理synchronization和特定案例,如null值。

synchronized (fruitMap) 
{ 
    if ((fruitMap.containsKey(fruitId) // The key is present 
    && (
      (fruitProperties == null && fruitMap.get(fruitId) == null) // fruitProperties is null, so is the stored value 
     || (fruitProperties != null && fruitProperties.equals(fruitMap.get(fruitId))) 
     ) 
    ) 
    { 
     fruitMap.remove(fruitId); 
    } 
} 

它工作在Java 6中,這是一個等價於:

fruitMap.remove(fruitId, fruitProperties); 
1

Objects.equals有這樣一個實現:

public static boolean equals(Object a, Object b) { 
    return (a == b) || (a != null && a.equals(b)); 
} 

因此,摘掉的默認實現:

if (map.containsKey(key) && Objects.equals(map.get(key), value)) { 
    map.remove(key); 
    return true; 
} else 
    return false; 

可以在Java 6可以寫成:

if (map.containsKey(key) && ((map.get(key) == value) || (map.get(key) != null && map.get(key).equals(value)))) { 
    map.remove(key); 
    return true; 
} else 
    return false; 
1

按了Java文件,刪除(對象鍵,對象的值)

刪除,只有當它是當前映射 指定鍵進入到指定的值。

如果你的equals()方法正確定義,你可以做這樣的事情

FruitProperties valueFromMap = map.get(key); 
if(valueFromMap != null){ 
    if(valueFromMap == originalValue || valueFromMap.equals(originalValue)){ 
    map.remove(key); 
    } 
} 

現在你正在使用簡單的HashMap,我認爲你會被照顧線程安全的要麼將其同步,要麼將其更改爲ConcurrentHashMap :)

相關問題