Java 8如何使用并行流按条件过滤ProductDto列表匹配Product对象
实现方案
核心逻辑可以直接合并到同一个filter规则中,不需要拆分多个过滤步骤:先匹配name、type字段,code的匹配规则简化为「只要任意一方code为null就跳过code校验,仅当双方code都不为空时要求相等」即可完全对齐原for循环的逻辑。
完整实现代码如下:
import java.util.Objects; import java.util.Optional; ProductDto find(List<ProductDto> productDtos, Product product) { return productDtos.parallelStream() .filter(dto -> // 匹配name、type,用Objects.equals避免空指针异常 Objects.equals(dto.getName(), product.getName()) && Objects.equals(dto.getType(), product.getType()) // code匹配规则:任意一方为null则跳过匹配,都不为空时要求相等 && (dto.getCode() == null || product.getCode() == null || Objects.equals(dto.getCode(), product.getCode())) ) // 并行场景下优先用findAny获取任意匹配项性能更高,如需严格保留原for循环的顺序匹配规则可替换为findFirst() .findAny() // 无匹配项时返回null,和原逻辑完全对齐 .orElse(null); }
注意事项
- 如果你确定业务场景中name、type、code字段一定不会为null,可以把
Objects.equals替换为直接调用equals方法。 - 如果你需要返回所有匹配的对象列表,把最后的
findAny().orElse(null)替换为.collect(Collectors.toList())即可。 - 并行流适合数据量较大的场景,如果列表长度很小,并行流的线程调度开销反而会高于普通for循环,可按需选择。
内容的提问来源于stack exchange,提问作者user15923931
相关产品推荐
相关产品推荐

