初始化集合的花样new HashMap<String, String>{ {put("str1":"abc");} }(转)

Map集合的普通初始化方法:

Map<String, String> map = new HashMap<String, String>();
        map.put("Name", "June");
        map.put("QQ", "2572073701");

  今天看到这样的写法:

 /** 不可重试异常 参数错误 **/
    @SuppressWarnings("serial")
    public static final Map<String, String> SMS_PARAM_ERROR_UNRETRY =
        new HashMap<String, String>() {
          {
            put(SMS_RESP_208001, "参数错误");
            put(SMS_RESP_208101, "有重复请求数据");
            put(SMS_RESP_208102, "资源竞争");
            put(SMS_RESP_208200, "数据库异常");
            put(SMS_RESP_208500, "缓存异常");
          }
        };

  前面以为是jdk7或者jdk8的新特征

后面查看资料是利用继承、代码块、内部类的实现

相当于创建的是一个HashMap的子类对象,且该子类中有实例代码块做一个初始化赋值操作,实例代码块中可以随意调用实例方法。

代码:

 Map<String, String> map1 =  new HashMap<String, String>() {
            {
                put("Name", "June");
                put("QQ", "2572073701");
            }
        };
        for(Map.Entry<String, String> entry : map1.entrySet() ){
            System.out.println(entry.getKey() + ", " + entry.getValue() );
        }

反编译:

package kunpu.test1;

import java.io.PrintStream;
import java.util.HashMap;
import java.util.Map;
import java.util.Map.Entry;

public class SimpleCollectCreateDemo1
{
  public static void main(String[] args)
  {
    Map<String, String> map1 = new HashMap() {};
    for (Map.Entry<String, String> entry : map1.entrySet()) {
      System.out.println((String)entry.getKey() + ", " + (String)entry.getValue());
    }
  }
}
package kunpu.test1;

import java.util.HashMap;

final class SimpleCollectCreateDemo1$1
  extends HashMap<String, String>
{
  SimpleCollectCreateDemo1$1()
  {
    put("Name", "June");
    put("QQ", "2572073701");
  }
}

 

同理,ArrayList等也可以使用同样的方式进行初始化:

List<String> stringList = new ArrayList<String>(){
            {
                add("str1");
                add("str2");
                remove("str1");
            }
        };
        for(String s : stringList){
            System.out.println(s);
        }

 

 

在jdk1.7的新特征中进行了java集合的增强支持:

摒弃了Java集合接口的实现类,如:ArrayListHashSetHashMap。而是直接采用[]{}的形式存入对象,采用[]的形式按照索引、键值来获取集合中的对象,如下:

所以初始化集合的方式不是仅仅的死板哦。

 

4、文艺写法的潜在问题
    文章开头提到的文艺写法的好处很明显就是一目了然。这里来罗列下此种方法的坏处,如果这个对象要串行化,可能会导致串行化失败。
  1.此种方式是匿名内部类的声明方式,所以引用中持有着外部类的引用。所以当串行化这个集合时外部类也会被不知不觉的串行化,当外部类没有实现serialize接口时,就会报错。

2.上例中,其实是声明了一个继承自HashMap的子类。然而有些串行化方法,例如要通过Gson串行化为json,或者要串行化为xml时,类库中提供的方式,是无法串行化Hashset或者HashMap的子类的,从而导致串行化失败。解决办法:重新初始化为一个HashMap对象:

  new HashMap(map);  

这样就可以正常初始化了。

 

参考链接:http://blog.163.com/qqabc20082006@126/blog/static/22928525201022094041502/

public NettyServerHandlerModbus() { List<String> roomNumStr = Arrays.asList("1", "2", "3", "4"); for (String roomNum : roomNumStr) { // 电路ABC状态 Optional.ofNullable(iElectricControlService.findCurrentVoltageState(roomNum)) .ifPresent(ecMap -> { stateMap.put("A", ecMap.getOrDefault("A", "0").toString().charAt(0)); stateMap.put("B", ecMap.getOrDefault("B", "0").toString().charAt(0)); stateMap.put("C", ecMap.getOrDefault("C", "0").toString().charAt(0)); stateMaps.put("room" + roomNum, stateMap); }); // 8路和照明状态 Optional.ofNullable(iPowerControlService.findPowerAndLightingState(roomNum)) .ifPresent(powMap -> powMap.forEach((key, value) -> { stateMap.put(key, value.toString().charAt(0)); stateMaps.put("room" + roomNum, stateMap); })); // 采样总管状态 Map<String, Object> samMap = iSamplingHeaderService.findSamplingHeader(roomNum); if (samMap != null && !samMap.containsKey("error")) { stateMap.put("cy", samMap.getOrDefault("state", "0").toString().charAt(0)); stateMaps.put("room" + roomNum, stateMap); } // 空调开关状态 List<Map<String, Object>> ktListMap = iOnOffStateService.airPowerOnOffState(roomNum); if (ktListMap != null && ktListMap.size() >= 2) { stateMap.put("kt1", ktListMap.get(0).getOrDefault("onOff", "0").toString().charAt(0)); stateMap.put("kt2", ktListMap.get(1).getOrDefault("onOff", "0").toString().charAt(0)); stateMaps.put("room" + roomNum, stateMap); } // 除湿机开关状态 Map<String, Object> csMap = iAirConditionerService.getDehumidifier(roomNum); stateMap.put("cs", Optional.ofNullable(csMap) .map(map -> map.getOrDefault("state", "0").toString().charAt(0)) .orElse('0')); stateMaps.put("room" + roomNum, stateMap); } // 门禁状态 OnOffState onOffState = iOnOffStateService.selectEgsLatest(); stateMap.put("men", Optional.ofNullable(onOffState) .map(OnOffState::getOnOff) .orElse("0").charAt(0)); stateMaps.put("room3", stateMap); } 优化
最新发布
06-27
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值