如何在Java中将HashMap的键视为可选的

4

在将Map作为函数参数时,只有3个键的值被填充。然而,当该函数在另一个函数中调用时,用户会填充初始2个键的值,而不需要分配任何值给第3个键。但是,如果第3个键没有分配任何值,则第3个键显示为null值。

是否有任何方法可以避免这种情况。如果用户不为第三个键分配任何值,则它必须为空,而不是null值。

     public String setMapValues(Map<String,String> testMap) throws Exception
  {
    String str="";

    str= testMap.get("a");
    str+=testMap.get("b");
    str+=testMap.get("c");

    info(str);

    return str;
  }



    public void run() throws Exception 
    {
    LinkedHashMap<String,String> myMap = new LinkedHashMap<String,String>();
    myMap.put("a", "James");
    myMap.put("b", "Bond");
    this.setMapValues(myMap);
}

该函数调用显示JamesBondnull作为输出,实际上应该忽略/跳过结尾处的null,并仅显示JamesBond作为输出。

然后检查返回值是否为null,如果是null,则不显示任何内容...或者使用Hashtable。 - Martin V.
非常感谢Martin和默认语言环境。 - Steve
5个回答

3
您可以使用类似以下的函数:
static String nullAsEmpty(Object o) {
   return o == null ? "" : o.toString();
}

public String setMapValues(Map<String,String> testMap) {
    String str = nullAsEmpty(testMap.get("a")) +
                 nullAsEmpty(testMap.get("b")) +
                 nullAsEmpty(testMap.get("c"));

    info(str);

    return str;
}

2
怎么样:
String temp = testMap.get("c");
str+= (temp == null : "" : temp);

1
你可以实现自己的Map版本:
import java.util.HashMap;

class MyMap<K, V> extends HashMap<K, V> {  
    @Override
    public V get(Object key) {
        V val = super.get(key);
        if (val != null) {
            return val;
        } else {
            return "";
        }
    }
}

那就使用MyMap而不是Map


1

如果您知道所有可能为空的键,请使用默认值初始化地图

Map getInstance(){

    Map<String,String> myMap = new LinkedHashMap<String,String>();

    myMap.put("a", "");
    myMap.put("b", "");
    myMap.put("b", "");

   return myMap;
}

通过放置重复的键,旧值将被新值替换。

我看得太晚了,但必须承认Vadchens的继承方案比我更好。但是,您可能需要使用重写Value-Generic参数并直接将其设置为String来进行继承:class MyMap<K> extends HashMap<K, String>。 - Jan Piel

1

完整的内容:

如果您使用Vadchens的答案 - 这是更好的选择 - 您可以做两件事情:

通过直接将泛型值参数设置为String来扩展您的地图

 class MySecMap<K> extends LinkedHashMap<K, String>{
    @Override
    public String get(Object key) {
        String val = super.get(key);
        if (val != null) {
            return val;
        } else {
           return "";
        }
    }
}

或者创建一个带有额外接口和默认值提供程序的类:

interface IDefaultValueProvider<V>{
    V getDefaultValue();
}

class MyMap<K, V, D extends IDefaultValueProvider<V>> extends LinkedHashMap<K, V>{

    private IDefaultValueProvider<V> provider;

    public MyMap(IDefaultValueProvider<V> p){
        super();
        provider = p;
    }

    @Override
    public V get(Object key) {
        V val = super.get(key);
        if (val != null) {
            return val;
        } else {
            return this.provider.getDefaultValue();
        }
    }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接