如何过滤MediaDTO列表并按sizeType生成对应子列表?解决equals比较始终为false的问题
解决
m.getSizeType().equals(imageSizeType)始终返回false的问题 看起来你遇到的核心问题是类型不匹配以及枚举与字符串字面量不对应导致的比较失败,咱们一步步来解决:
问题根源分析
- 类型不一致:
MediaDTO的sizeType是String类型(比如示例中的"THUMBNAIL"、"SMALL"),而ImageSizeType是一个枚举类。Java中String和枚举对象直接调用equals()时,因为类型不同,会直接返回false——equals()方法首先会检查两个对象的类型是否相同,不同类型直接不相等。 - 字面量不匹配:从你的代码看,枚举里用了
ImageSizeType.THUMB,但示例中MediaDTO的sizeType是"THUMBNAIL",即使类型一致,字面量不同也会比较失败。
解决方案
步骤1:修正枚举类,让它与MediaDTO的sizeType对应
首先确保枚举的取值和MediaDTO中sizeType的字符串完全匹配,建议给枚举添加一个字符串属性来存储对应的匹配值:
public enum ImageSizeType { SMALL("SMALL"), MEDIUM("MEDIUM"), LARGE("LARGE"), THUMBNAIL("THUMBNAIL"); // 改成和MediaDTO中一致的"THUMBNAIL",替换原来的THUMB private final String sizeValue; ImageSizeType(String sizeValue) { this.sizeValue = sizeValue; } // 获取对应的字符串值 public String getSizeValue() { return sizeValue; } // 可选:添加静态方法,支持根据字符串获取枚举(容错处理) public static ImageSizeType fromString(String sizeType) { for (ImageSizeType type : ImageSizeType.values()) { // 可以用equalsIgnoreCase兼容大小写差异,比如"thumbnail"和"THUMBNAIL"都能匹配 if (type.sizeValue.equalsIgnoreCase(sizeType)) { return type; } } throw new IllegalArgumentException("Unsupported size type: " + sizeType); } }
步骤2:修改比较逻辑,让类型一致后再比较
现在有两种可靠的比较方式,选一种适合你的:
方式一:用枚举的字符串值和MediaDTO的sizeType比较
直接用枚举的getSizeValue()方法拿到对应的字符串,和MediaDTO的sizeType做比较:
private String generateOccUrl(List<MediaDTO> mediaDTOs, ImageSizeType imageSizeType){ return mediaDTOs.stream() .filter(m -> imageSizeType.getSizeValue().equals(m.getSizeType())) // 如果需要兼容大小写,换成equalsIgnoreCase // .filter(m -> imageSizeType.getSizeValue().equalsIgnoreCase(m.getSizeType())) .map(MediaDTO::getLiveloUrl) .collect(Collectors.joining(",")); // 用Collectors.joining替代reduce,避免空列表返回多余的"," }
方式二:将MediaDTO的sizeType转为枚举后比较
如果希望更严谨地校验sizeType的合法性,可以把字符串转为枚举后再比较(需要处理非法值):
private String generateOccUrl(List<MediaDTO> mediaDTOs, ImageSizeType imageSizeType){ return mediaDTOs.stream() .filter(m -> { try { return ImageSizeType.fromString(m.getSizeType()) == imageSizeType; } catch (IllegalArgumentException e) { // 遇到不合法的sizeType时,直接跳过该元素 return false; } }) .map(MediaDTO::getLiveloUrl) .collect(Collectors.joining(",")); }
额外优化:替换reduce为Collectors.joining
你之前用reduce(",", String::concat)有个小问题:当没有匹配到任何元素时,会返回","而不是空字符串。用Collectors.joining(",")会更合理,空列表时返回空字符串,有元素时自动用逗号分隔。
这样修改后,你的过滤逻辑就能正常工作,不会再出现比较始终返回false的问题了。
内容的提问来源于stack exchange,提问作者Binyamin Ely
相关产品推荐
相关产品推荐

