如何获取HashMap指定Key的Value列表?JSON对比修改报错解决
问题解决与优化方案
一、修复类型不兼容错误
你遇到的类型不兼容问题,是编译器类型推断失效导致的,可通过以下方式修复:
- 明确Lambda参数与泛型类型:在遍历用户时指定实体类类型,同时明确
toList()的泛型,让编译器正确识别类型:
HashMap<String, List<String>> map = new HashMap<>(); json1.data().user().forEach((User user) -> { map.put(user.id(), user.items().stream() .map(k -> k.itemId()) .collect(Collectors.<String>toList())); }); // 遍历json2处理状态修改 json2.entity().user().forEach((User user) -> { if (map.containsKey(user.id())) { List<String> val = map.get(user.id()); // 匹配itemId并修改state user.items().forEach(item -> { if (val.contains(item.itemId())) { item.setState("old"); } }); } });
- 检查ID类型一致性:如果
user.id()返回的不是String(比如Integer),要同步修改HashMap的key类型,比如HashMap<Integer, List<String>>,避免类型不匹配。
二、更简便的替代方案
没必要单独存储itemId列表,直接用Map缓存json1的用户对象,对比时直接关联用户的items集合,代码更简洁且减少内存开销:
// 缓存json1所有用户,key为user.id Map<String, User> json1UserMap = json1.data().user().stream() .collect(Collectors.toMap(User::id, Function.identity())); // 遍历json2处理状态 json2.entity().user().forEach(user -> { User json1User = json1UserMap.get(user.id()); if (json1User != null) { // 用Set存储itemId,提升查找效率 Set<String> json1ItemIds = json1User.items().stream() .map(Item::itemId) .collect(Collectors.toSet()); // 修改匹配的item状态 user.items().forEach(item -> { if (json1ItemIds.contains(item.itemId())) { item.setState("old"); } }); } });
这里用Set存储itemId是因为contains操作的时间复杂度比List更低(O(1) vs O(n)),数据量大时性能更优。
内容的提问来源于stack exchange,提问作者Jeet_dev
相关产品推荐
相关产品推荐

