如何在Java中校验对象列表是否包含指定字符串列表的全部key
代码问题点
Stream.forEach()是无返回值的终端操作,本身不会返回布尔结果,你原写法用变量接收肯定无法得到预期的校验结果- 校验逻辑完全写反:你现有逻辑是遍历表单字段,判断每个必填项是否包含当前表单字段名,完全偏离了「校验所有必填项都在表单中存在」的需求
- 嵌套循环时间复杂度为O(n*m),数据量稍大时效率较低
最优实现方案
优先把表单字段名提取为Set后用containsAll判断,时间复杂度为O(n+m),性能最优:
import java.util.Set; import java.util.stream.Collectors; // 第一步:提取formData中所有fieldName存入Set,注意替换FieldData为你实际的实体类名 Set<String> formFieldSet = formData.stream() .map(FieldData::getFieldName) .collect(Collectors.toSet()); // 第二步:直接判断是否覆盖所有必填项 boolean isAllRequiredPresent = formFieldSet.containsAll(requiredTypes);
注:你代码中用到的
val是Java 10+才支持的局部变量类型推断写法,Java 8环境需要显式声明变量类型Set<String>、boolean。
轻量场景备选方案
如果数据量非常小,不想额外创建Set,也可以直接用Stream的匹配API实现:
boolean isAllRequiredPresent = requiredTypes.stream() .allMatch(requiredKey -> formData.stream() .anyMatch(fieldData -> requiredKey.equals(fieldData.getFieldName())) );
这个写法不需要额外存储中间集合,但本质还是嵌套循环,仅适合数据量很小的场景使用。
内容的提问来源于stack exchange,提问作者Sophie
相关产品推荐
相关产品推荐

