List.contains(String)方法工作异常,属性存在性校验失败咨询
解决List.contains()校验属性列表的问题
首先,咱们先明确List.contains()的核心工作逻辑:它会遍历列表中的每个元素,调用元素的equals()方法和传入的对象进行比较,只要有一个元素返回true,contains就会返回true。对于String类型来说,因为String重写了equals()方法,是直接比较字符串的内容,所以你给出的例子里,subscriptionAttrList.contains("ALL")应该是返回true的——如果你的代码出现了异常行为,大概率是其他细节问题。
可能导致contains“异常”的原因
- 字符串存在隐藏字符或格式问题:比如
strAttributeList里的"ALL"实际是" ALL"(带前导空格)、"ALL "(带尾随空格)或者"all"(大小写不匹配),肉眼看起来一样,但内容实际不同 - 列表元素类型不匹配:比如
subscriptionAttrList里的元素不是String,而是自定义的属性对象,且没有重写equals()方法,这时候contains会用默认的引用比较,自然匹配不上 - 特殊List实现的逻辑差异:如果你用的不是Java原生的ArrayList/LinkedList,而是某些第三方库的List实现,可能contains的逻辑有自定义改动
解决方案与正确代码示例
1. 先排查元素本身的问题
在循环里加入日志,打印每个待校验元素的细节,确认内容是否符合预期:
for(String strAttrValue : strAttributeList) { // 用单引号包裹,方便看出是否有空格 System.out.println("待校验属性:'" + strAttrValue + "'"); if(!subscriptionAttrList.contains(strAttrValue)) { System.out.println("校验失败:属性'" + strAttrValue + "'不存在于全部列表中"); } }
如果发现有空格,可以先调用trim()处理后再比较:
if(!subscriptionAttrList.contains(strAttrValue.trim())) { // ... }
如果是大小写问题,可以统一转成小写/大写再比较:
if(!subscriptionAttrList.stream().anyMatch(s -> s.equalsIgnoreCase(strAttrValue))) { // ... }
2. 完整的校验逻辑代码
不管是用循环还是Stream,正确的校验逻辑应该是这样的:
循环写法:
boolean isAllAttributesValid = true; for(String strAttrValue : strAttributeList) { // 这里可以根据需要加入trim或大小写转换的处理 if(!subscriptionAttrList.contains(strAttrValue)) { isAllAttributesValid = false; System.out.println("属性 '" + strAttrValue + "' 不在全部属性列表内"); // 可选:如果只要有一个不匹配就终止校验,就加break // break; } } // 后续根据isAllAttributesValid做业务处理 if(isAllAttributesValid) { // 所有属性都合法,执行后续逻辑 } else { // 存在非法属性,提示或拦截 }
Java 8+ Stream简化写法:
boolean isAllAttributesValid = strAttributeList.stream() // 同样可以在这里加入trim等处理,比如s -> subscriptionAttrList.contains(s.trim()) .allMatch(subscriptionAttrList::contains);
3. 自定义对象的特殊处理(如果适用)
如果你的属性列表里不是String,而是自定义的Attribute对象,一定要重写equals()和hashCode()方法,确保比较的是属性的内容而非对象引用:
class Attribute { private String value; // 构造器、getter、setter省略 @Override public boolean equals(Object o) { if (this == o) return true; if (o == null || getClass() != o.getClass()) return false; Attribute attribute = (Attribute) o; return Objects.equals(value, attribute.value); } @Override public int hashCode() { return Objects.hash(value); } }
内容的提问来源于stack exchange,提问作者shrey mathuria
相关产品推荐
相关产品推荐

