如何使用Java Streams优雅实现列表包含指定id对应对象的校验
默认你的MyObj类已经为id字段实现了Getter方法getId(),可以根据业务场景选择以下两种实现方案:
方案1:高可读性写法(适合中小数据量列表)
直接分两次匹配两个id,逻辑清晰易懂,代码维护成本最低:
// inputId1、inputId2为用户输入的待校验两个id boolean isBothExist = myList.stream().anyMatch(obj -> inputId1.equals(obj.getId())) && myList.stream().anyMatch(obj -> inputId2.equals(obj.getId()));
方案2:高性能写法(适合大数据量列表)
仅遍历一次列表统计匹配到的不同id数量,避免两次遍历的性能开销:
import java.util.Objects; // 匹配到的不同id数量 long matchedIdCount = myList.stream() .map(MyObj::getId) // 用Objects.equals避免id为null时空指针 .filter(id -> Objects.equals(inputId1, id) || Objects.equals(inputId2, id)) // 去重,避免同个id重复出现导致计数错误 .distinct() .count(); boolean isBothExist = matchedIdCount == 2;
注意:如果你的业务场景中允许列表里存在多个同id的
MyObj实例,必须加distinct()做去重,否则会出现单个id匹配多次导致计数错误的问题。
内容的提问来源于stack exchange,提问作者eaRobust
相关产品推荐
相关产品推荐

