使用TreeMap收集城市与邮编列表报错UnsupportedOperationException
问题修复:城市对应邮编列表收集异常
错误原因
报错的java.lang.UnsupportedOperationException是因为你通过Arrays.asList(user.getPincode())创建的列表是固定大小的不可变列表,当执行list.add(user.getPincode())尝试添加新元素时,就会触发这个异常。Arrays.asList()返回的内部列表实现并没有重写add、remove等修改方法,调用这些方法会直接抛出不支持操作的异常。
修复方案
简洁版(推荐)
使用TreeMap的computeIfAbsent方法,自动处理城市是否存在的逻辑,同时创建可修改的ArrayList:
@Override public TreeMap<String, List<String>> getCityWithPincode() { List<User> listOfUser = findAllUser(); TreeMap<String, List<String>> tm = new TreeMap<>(); for(User user : listOfUser) { // 若城市不存在则创建新的ArrayList,存在则直接获取列表,然后添加邮编 tm.computeIfAbsent(user.getCity(), k -> new ArrayList<>()) .add(user.getPincode()); } return tm; }
原逻辑修改版
如果你想保留原来的判断逻辑,只需把Arrays.asList替换为可修改的ArrayList:
@Override public TreeMap<String, List<String>> getCityWithPincode() { List<User> listOfUser = findAllUser(); TreeMap<String, List<String>> tm = new TreeMap<>(); for(User user : listOfUser) { String city = user.getCity(); String pincode = user.getPincode(); if(tm.containsKey(city)) { tm.get(city).add(pincode); } else { List<String> pincodeList = new ArrayList<>(); pincodeList.add(pincode); tm.put(city, pincodeList); } } return tm; }
补充说明
原来代码里的if(tm.isEmpty())判断完全多余,因为tm.containsKey(user.getCity())在Map为空时自然会返回false,进入else分支创建新列表。
内容的提问来源于stack exchange,提问作者Subham Kr Gupta
相关产品推荐
相关产品推荐

