4

使用 Map 作为函数参数时,仅填充 3 个键的值。但是,当在另一个函数中调用此函数时,用户会填充初始 2 个键的值,并且他不需要为第 3 个键分配任何值。但是,如果第 3 个键未分配任何值,则第 3 个键显示空值。

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

     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 显示为输出。

4

5 回答 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;
}
于 2013-04-11T07:51:30.247 回答
2

怎么样:

String temp = testMap.get("c");
str+= (temp == null : "" : temp);
于 2013-04-11T07:48:44.573 回答
1

您可以实现您的地图版本:

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

于 2013-04-11T07:55:33.547 回答
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();
        }
    }
}
于 2013-04-11T08:35:51.030 回答
1

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

Map getInstance(){

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

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

   return myMap;
}

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

于 2013-04-11T08:02:26.780 回答