Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/apache-kafka/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何将Java8map.remove转换为Java1.6?_Java - Fatal编程技术网

如何将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);
    }
}