如何从Object[]数组内的HashMap<String, Object>提取shownUserId值
提取Object[]中HashMap的shownUserId值
方法一:基础循环遍历(兼容Java 8及更早版本)
直接遍历数组,逐个判断类型并提取目标值:
List<String> shownUserIds = new ArrayList<>(); Object[] shownUsers = user.getAlreadyShownUser(); if (shownUsers != null) { for (Object item : shownUsers) { // 先判断当前元素是否为HashMap类型 if (item instanceof HashMap) { HashMap<String, Object> userMap = (HashMap<String, Object>) item; Object idObj = userMap.get("shownUserId"); // 确保提取到的是String类型 if (idObj instanceof String) { shownUserIds.add((String) idObj); } } } }
方法二:Java 8+ Stream流简化写法
利用Stream链式调用简化遍历、过滤和转换逻辑:
import java.util.Arrays; import java.util.List; import java.util.stream.Collectors; // 提取逻辑 List<String> shownUserIds = Arrays.stream(user.getAlreadyShownUser()) .filter(item -> item instanceof HashMap) // 过滤出HashMap类型元素 .map(item -> (HashMap<String, Object>) item) // 强转为HashMap .map(map -> map.get("shownUserId")) // 获取shownUserId对应的值 .filter(id -> id instanceof String) // 确保是String类型 .map(id -> (String) id) // 强转成String .collect(Collectors.toList()); // 收集为List
更优方案:重构实体类(类型安全)
当前用Object[]存储HashMap的方式缺乏类型安全,易出现转换异常。建议创建对应实体类封装数据:
import java.time.LocalDateTime; public class ShownUser { private String shownUserId; private LocalDateTime shownAt; // Getter、Setter方法 public String getShownUserId() { return shownUserId; } public void setShownUserId(String shownUserId) { this.shownUserId = shownUserId; } public LocalDateTime getShownAt() { return shownAt; } public void setShownAt(LocalDateTime shownAt) { this.shownAt = shownAt; } }
修改User实体的字段:
@Schema private ShownUser[] alreadyShownUser; // 或使用List提升灵活性:private List<ShownUser> alreadyShownUser;
此时提取shownUserId会更简洁安全:
// 数组转List提取 List<String> shownUserIds = Arrays.stream(user.getAlreadyShownUser()) .map(ShownUser::getShownUserId) .collect(Collectors.toList()); // 如果是List类型直接处理 // List<String> shownUserIds = user.getAlreadyShownUser().stream() // .map(ShownUser::getShownUserId) // .collect(Collectors.toList());
内容的提问来源于stack exchange,提问作者sejin park
相关产品推荐
相关产品推荐

