如何将Java8map.remove转换为Java1.6?
我有以下资料:如何将Java8map.remove转换为Java1.6?,java,Java,我有以下资料: fruitMap.remove(fruitId, fruitProperties); 结果图是: private Map<FruitId, FruitProperties> fruitMap = new HashMap<FruitId, FruitProperties>(); private-Map-foultmap=new-HashMap(); 当我试图构建我的代码时,我得到一个: ERROR The method remove(Obje
fruitMap.remove(fruitId, fruitProperties);
结果图是:
private Map<FruitId, FruitProperties> fruitMap = new HashMap<FruitId, FruitProperties>();
private-Map-foultmap=new-HashMap();
当我试图构建我的代码时,我得到一个:
ERROR
The method remove(Object) in the type Map<MyImplementation.FruitId, FruitProperties>
is not applicable for the arguments (Map<MyImplementation.FruitId, FruitProperties>)
错误
方法在类型映射中删除(对象)
不适用于参数(映射)
问题是什么
请注意,此调用位于我的“水果实现”类中的“removeFruit()”方法内部。您必须自己测试该值:
if(fruitProperties.equals(fruitMap.get(fruitId)) {
fruitMap.remove(fruitId);
}
注意,我在这里的实现假设您正在测试一个非空的futurproperties
对象 来自:
对于此映射,默认实现相当于:
默认实现不保证此方法的同步性或原子性属性。任何提供原子性保证的实现都必须重写此方法并记录其并发属性
因此,您可以使用默认实现。也许可以把它放在一个静态助手方法中
但是如果这是线程安全的,你可能需要添加一些同步代码(或者考虑使用并发映射,顺便说一下,java 5以来已经有了移除方法)。
< p>你需要做如下假设你的值不能是代码> null < /Calp>if (fruitProperties.equals(fruitMap.get(fruitId))
fruitMap.remove(fruitId);
注意:要使其成为线程安全的,您需要将其包装在
synchronized
块中。这里是完整的解决方案,处理同步
和特定情况,如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);
具有如下实现:
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;
根据Java文档,删除(对象键、对象值) 仅当指定项当前已映射时,才删除该项 设置为指定的值 如果正确定义了equals(),则可以执行以下操作
FruitProperties valueFromMap = map.get(key);
if(valueFromMap != null){
if( valueFromMap == originalValue || valueFromMap.equals(originalValue)){
map.remove(key);
}
}
现在您正在使用简单的HashMap,我假设您将通过同步或将其更改为ConcurrentHashMap:)如果键当前映射到值,则移除(键,值)
方法移除键的条目。该方法是在Java1.8中添加的。Map
接口的Javadoc提到以下默认实现:
if (map.containsKey(key) && Objects.equals(map.get(key), value)) {
map.put(key, newValue);
return true;
} else
return false;
由于Objects
类仅在Java1.7中添加,因此对于Java1.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);
}
}
请注意,这不是线程安全的。如果您从多个线程访问映射,则必须添加一个同步块。如何定义fruitId
?Java 6没有对象
类。我认为它必须同步?如果没有对象类,您将如何处理?我不确定是否必须这样做,我希望在不破坏任何东西的情况下保留这种代码风格。如果需要同步,您可能希望使用ConcurrentMap,它甚至在Java8之前就有remove方法。(请注意,Java8中的默认实现也不是同步的——而是针对并发映射的)。代替Objects.equals,您可以使用fruitProperties.equals
(假设它们永远不能为null)。@Rolando您的Java 8代码不是线程安全的,因此如果您只想模仿Java 8代码,就不需要关心线程安全/同步。对象的Java 8文档描述了它的功能,所以你可以自己编写代码。如果(a==null&&b==null)返回true,则本质上是;如果(a==null)返回false;如果(b==null)返回false;返回a等于(b)代码>
if (map.containsKey(key) {
Object storedValue = map.get(key);
if (storedValue == null ? value == null : storedValue.equals(value)) {
map.remove(key);
}
}