如何遍历HashMap内的HashSet并将其元素存入ArrayList避免类型转换错误
解决方案
你遇到的问题核心是两点:HashMap的值为Object类型需要先做安全类型转换,之前的stream操作缺少collect收尾导致类型不匹配。以下是可直接运行的修正代码:
import org.apache.commons.lang3.StringUtils; import java.util.*; Map<String, Object> types = System.getPartyItems(); List<PartyItem> myPartyList = new ArrayList<>(); for (Map.Entry<String, Object> entry : types.entrySet()) { if (StringUtils.contains(entry.getKey(), "balloon")) { Object value = entry.getValue(); // 先校验值类型避免强转崩溃 if (value instanceof HashSet<?>) { HashSet<?> balloonSet = (HashSet<?>) value; // 校验集合内元素类型 if (!balloonSet.isEmpty() && balloonSet.iterator().next() instanceof PartyItem) { // 直接将HashSet所有元素批量添加到List,无需额外stream操作 myPartyList.addAll((Collection<? extends PartyItem>) balloonSet); } } // 确认只有一个含balloon的键时可直接跳出循环 break; } } // 后续遍历示例 for (PartyItem item : myPartyList) { // 你的业务处理逻辑 }
如果你一定要用stream实现,正确写法如下:
List<PartyItem> myPartyList = balloonSet.stream() .map(item -> (PartyItem) item) .collect(Collectors.toList());
报错原因说明
你遇到的class java.util.stream.ReferencePipeline$Head cannot be cast to class java.util.ArrayList错误,是因为stream操作没有调用collect(Collectors.toList())方法:stream本身是流对象不是集合类型,必须调用collect方法将流转换为集合实例才能赋值给List变量。
常见疑问解答
不需要提前把HashSet赋值给变量也能操作,但赋值给临时变量做类型校验能大幅降低空指针、类型转换异常的出现概率,更推荐这种写法。
内容的提问来源于stack exchange,提问作者Yankeecandle
相关产品推荐
相关产品推荐

