JAVA基础之HashMap转List

前言

今天在开发中,用elasticsearch + java实现热门关键字搜索商品列表这样一个功能。。。惊恐遇到一个HashMap强转List失败问题。这里记录一下~大笑

调用接口

这里我先用postman调了通过热门关键字查询商品列表接口

发现500,服务器内部错误了。。。what?因为es在阿里云服务器上面,本地又不能打断点,debug调试。查看服务器日志,找到问题所在;

服务器日志

问题所在如下图:

噢~~~HashMap转强转List失败了。

发现问题

查看了日志,再看了看代码。

    @Override
    public Map<String, Object> handleEsGoodsVipPrice(Integer uId, Map<String, Object> map) {
        Map<String, Object> vipUser = vipUserMapper.queryUserVipInfoByUserId(uId);
        // es查询结果得到Map,map中取到esGoods,转为list,处理数据后返回
        List<EsGoods> list = (List<EsGoods>) map.get("esGoods");

        if (vipUser != null) {
            // 用户有Vip等级
            // 根据userID得到用户vip等级ID
            Integer gradeId = (Integer) vipUser.get("gradeId");
            list.forEach(bsGoodsRecommendH5 -> {
                BsGoodsVipPrice goodsVipPrice = goodsVipPriceMapper.queryVipPricesByGoodsIdAndVipId(bsGoodsRecommendH5.getGoodsId(), gradeId);
                if (goodsVipPrice != null && goodsVipPrice.getVipPrice() != null) {
                    bsGoodsRecommendH5.setVipPrice(goodsVipPrice.getVipPrice());
                } else {
                    //如果没查到该用户对应vip等级的vip价格  取最低Vip等级的vip价格
                    Long defaultVipPrice = goodsVipPriceMapper.queryDefaultVipPriceByGoodsId(bsGoodsRecommendH5.getGoodsId());
                    bsGoodsRecommendH5.setVipPrice(defaultVipPrice);
                }
            });

        } else {
            // 用户没有vip等级 vip价格默认取最低等级对应的价格
            list.forEach(bsGoodsRecommendH5 -> {
                Long defaultVipPrice = goodsVipPriceMapper.queryDefaultVipPriceByGoodsId(bsGoodsRecommendH5.getGoodsId());
                bsGoodsRecommendH5.setVipPrice(defaultVipPrice);
            });
        }
        map.put("esGoods", list);
        return map;
    }

原来就是这里强转出了问题

List<EsGoods> list = (List<EsGoods>) map.get("esGoods");

解决方法

呵~~既然hashMap强转list失败了,我就不强转了。先把hashMap先转为json字符串,然后将得到的json字符串转为list就ok了!!!

代码如下:生气

//将map.get("esGoods")先转为json字符串,然后将得到的json字符串转为list就ok了!!!
List<EsGoods> list = JsonUtils.json2ListBean(JsonUtils.toJson(map.get("esGoods")), EsGoods.class);

总结

map不能转list??因为开发时间比较紧,日后再带着这个问题,去寻找答案吧

附上json工具类
import com.fasterxml.jackson.annotation.JsonInclude.Include;
import com.fasterxml.jackson.core.JsonFactory;
import com.fasterxml.jackson.core.JsonGenerator;
import com.fasterxml.jackson.core.JsonParser.Feature;
import com.fasterxml.jackson.core.type.TypeReference;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.wybc.common.exception.BusiException;
import com.wybc.common.model.E;
import net.sf.json.JSONArray;

import java.beans.BeanInfo;
import java.beans.Introspector;
import java.beans.PropertyDescriptor;
import java.io.IOException;
import java.io.StringWriter;
import java.lang.reflect.Method;
import java.util.*;

/**
 * Json工具类
 */
public class JsonUtils {

	private static final ObjectMapper mapper = new ObjectMapper();

	static {
		mapper.configure(Feature.ALLOW_UNQUOTED_FIELD_NAMES, true);
		mapper.configure(Feature.ALLOW_UNQUOTED_CONTROL_CHARS, true);
		mapper.setSerializationInclusion(Include.NON_NULL);
	}

	private JsonUtils() {
	}

	/**
	 * json字符串转换为类
	 */
	public static <T> T toBean(String json, Class<T> clazz) {
		try {
			T bean = (T) mapper.readValue(json, clazz);
			return bean;
		} catch (IOException e) {
			e.printStackTrace();
		}
		return null;
	}

	@SuppressWarnings("unchecked")
	public static HashMap<String, Object> toBean(String json) {
		return toBean(json, HashMap.class);
	}

	@SuppressWarnings("unchecked")
	public static HashMap<String,String> toBeanStr(String json) {
		return toBean(json, HashMap.class);
	}
	
	@SuppressWarnings("unchecked")
	public static <T> T toBean(String json, TypeReference<T> tr){
		try {
			T bean = (T) mapper.readValue(json, tr);
			return bean;
		} catch (IOException e) {
			e.printStackTrace();
		}
		return null;
	}

	/**
	 * 对象转换为json字符串
	 */
	public static String toJson(Object bean) {
		String json = null;
		JsonGenerator gen = null;
		StringWriter sw = new StringWriter();
		try {
			gen = new JsonFactory().createGenerator(sw);
			mapper.writeValue(gen, bean);
			json = sw.toString();
		} catch (IOException e) {
			throw new BusiException(E.SYSTEM_ERROR);
		} finally {
			try {
				if (gen != null) {
					gen.close();
				}
				if (sw != null) {
					sw.close();
				}
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
		return json;
	}

	@SuppressWarnings("unchecked")
	public static List<Object> toList(String json) {
		return toBean(json, ArrayList.class);
	}

	/**
	 * 对象转换为Map
	 */
	public static Map<String, Object> transBean2Map(Object obj) {
		if (obj == null) {
			return null;
		}
		Map<String, Object> map = new HashMap<String, Object>();
		try {
			BeanInfo beanInfo = Introspector.getBeanInfo(obj.getClass());
			PropertyDescriptor[] propertyDescriptors = beanInfo.getPropertyDescriptors();
			for (PropertyDescriptor property : propertyDescriptors) {
				String key = property.getName();
				if (!key.equals("class")) {
					Method getter = property.getReadMethod();
					Object value = getter.invoke(obj);
					map.put(key, value);
				}
			}
		} catch (Exception e) {
			System.out.println("transBean2Map Error " + e);
		}
		return map;
	}

	/**
	 * json字符串转换为List
	 */
	public static <T> List<T>json2ListBean(String json,Class<T>cls){
		JSONArray jArray= JSONArray.fromObject(json);
	    Collection<T> collection = JSONArray.toCollection(jArray, cls);
	    List<T> list = new ArrayList<T>();
	    Iterator<T> it = collection.iterator();
	    while (it.hasNext()) {
	        T bean = (T) it.next();
	        list.add(bean);
	    }
	    return list;
	}
}

ps:工具能中用到的ObjectMapper类Jackson库的主要类,如果要了解该类的源码以及使用方法,可自行百度。学习之路任重而道远!

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 将HashMap换为List,可以使用Java 8的Stream API进行操作。下面是一个示例代码: ```java Map<Key, Value> map = new HashMap<>(); List<Value> list = map.entrySet().stream() .map(Map.Entry::getValue) .collect(Collectors.toList()); ``` 其中,`Key`和`Value`分别是HashMap中的键和值的类型。使用`entrySet()`方法获取Map中所有的键值对,然后使用`map()`方法将每个键值对换为对应的值,最后使用`collect()`方法将所有的值收集到List中。 ### 回答2: 将HashMap换为List的步骤: 1. 创建一个空的ArrayList来存储换后的元素。 2. 使用entrySet()方法获取HashMap中的键值对集合。 3. 遍历HashMap中的键值对集合。 4. 对于每一个键值对,使用getKey()方法获取键,使用getValue()方法获取值。 5. 创建一个临时的HashMap来存储键和值。 6. 将键和值添加到临时的HashMap中。 7. 将临时的HashMap添加到ArrayList中。 8. 循环完所有的键值对后,ArrayList中就存储了HashMap换后的元素。 9. 返回ArrayList。 以下是示例代码: ```java import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; public class HashMapToList { public static void main(String[] args) { // 创建一个HashMap Map<String, Integer> hashMap = new HashMap<>(); hashMap.put("A", 1); hashMap.put("B", 2); hashMap.put("C", 3); // 将HashMap换为List List<Map.Entry<String, Integer>> list = new ArrayList<>(hashMap.entrySet()); // 遍历List for (Map.Entry<String, Integer> entry : list) { System.out.println(entry.getKey() + ": " + entry.getValue()); } } } ``` 在上述代码中,首先创建了一个HashMap对象,并添加了几个键值对。然后,使用entrySet()方法将HashMap换为键值对集合,再将键值对集合存储到一个ArrayList中。最后,通过遍历ArrayList,可以访问换后的键值对。 ### 回答3: HashMapJava中的一种数据结构,用于存储键值对(key-value)的映射关系。当我们需要将HashMap换为List时,可以通过以下步骤实现。 首先,我们需要创建一个空的List对象来存储换后的结果。可以使用ArrayList或LinkedList这两种常见的List实现类。 然后,我们可以使用HashMap的entrySet()方法,将HashMap中的键值对以Entry的形式返回。Entry是HashMap中的一个静态内部类,每个Entry对象都包含了一个键(key)和一个对应的值(value)。 接下来,我们可以通过遍历Entry集合,将每个键值对提取出来,并将其添加到List中。可以使用迭代器或者增强的for循环来完成遍历过程。在每次遍历时,通过调用Entry的getKey()和getValue()方法可以获取到键和值。 最后,当遍历结束后,List中就包含了HashMap中的所有键值对。 以下是示例代码: ```java import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; public class HashMapToListExample { public static void main(String[] args) { // 创建一个HashMap并添加键值对 Map<String, Integer> hashMap = new HashMap<>(); hashMap.put("A", 1); hashMap.put("B", 2); hashMap.put("C", 3); // 将HashMap换为List List<Map.Entry<String, Integer>> list = new ArrayList<>(hashMap.entrySet()); // 遍历List并输出键值对 for (Map.Entry<String, Integer> entry : list) { System.out.println("Key: " + entry.getKey() + ", Value: " + entry.getValue()); } } } ``` 上述代码将HashMap换为List,并通过遍历List输出了每个键值对的键和值。 通过以上步骤,我们可以将HashMap换为List,并且方便地在List中进行后续操作。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值