如何用Java Stream判断List<String>是否包含自定义对象列表的全部指定字段值
问题原因分析
- 你的代码核心错误出在
anyMatch(authorizedList::equals)这一段:你已经通过map(MySerial::getSerial)把流转换成了String类型的serial值流,而authorizedList::equals是拿单个serial字符串和整个List对象做相等判断,两种完全不同类型的对象比较永远返回false,因此anyMatch永远返回false,取反后表达式结果为true,就会一直触发异常抛出逻辑。 - 另外你选择的流方法不符合需求语义:你需要判断所有serial都在授权列表中,应该用
allMatch方法直接匹配“全部满足条件”的语义,而非反向用anyMatch做判断。
正确实现方案
推荐先把授权列表转成HashSet提升查询效率,List的contains方法时间复杂度为O(n),HashSet的contains时间复杂度为O(1),数据量较大时性能优势明显:
// 先转成Set优化查询效率 Set<String> authorizedSet = new HashSet<>(authorizedList); // 校验所有serial都在授权范围内 if (!serials.stream() .map(MySerial::getSerial) .allMatch(authorizedSet::contains)) { throw new UnauthorizedException(); }
如果数据量很小不想额外转Set,也可以直接用原列表的contains方法,功能是一致的:
if (!serials.stream() .map(MySerial::getSerial) .allMatch(authorizedList::contains)) { throw new UnauthorizedException(); }
内容的提问来源于stack exchange,提问作者gamerounet
相关产品推荐
相关产品推荐

