Java 8 Stream如何对列表映射后的属性值执行过滤操作
Java Stream 实现对象映射与属性匹配方案
实现思路
- 首先将传入的待匹配字符串列表转为
HashSet,将属性匹配的查询复杂度从O(n)降低到O(1),大幅提升大数量级下的处理效率 - 通过Stream的
map算子完成原始Object对象到目标类的映射转换 - 通过Stream的
filter算子完成属性匹配校验,只保留属性值在匹配集合中的元素 - 最后通过
collect算子收集符合要求的结果
代码示例
import java.util.HashSet; import java.util.List; import java.util.Objects; import java.util.Set; import java.util.stream.Collectors; // 自定义目标类示例,可根据实际业务调整 class TargetDTO { private String targetField; // 其余属性、get/set方法省略 public String getTargetField() { return targetField; } public void setTargetField(String targetField) { this.targetField = targetField; } } // 缓存中取出的原始对象类示例,可根据实际业务调整 class CachePO { private String fieldToMatch; // 其余属性、get/set方法省略 public String getFieldToMatch() { return fieldToMatch; } public void setFieldToMatch(String fieldToMatch) { this.fieldToMatch = fieldToMatch; } } public class StreamMatchDemo { /** * 遍历缓存对象列表,完成映射后筛选属性匹配的元素 * @param cacheObjectList 从缓存中取出的Object类型对象列表 * @param matchStrList 传入的待匹配字符串值列表 * @return 符合属性匹配要求的目标类对象列表 */ public List<TargetDTO> filterMatchedData(List<Object> cacheObjectList, List<String> matchStrList) { // 提前转Set优化查询效率 Set<String> matchStrSet = new HashSet<>(matchStrList); return cacheObjectList.stream() // 对象映射逻辑,根据实际业务替换 .map(obj -> { if (!(obj instanceof CachePO originalPo)) { return null; } TargetDTO dto = new TargetDTO(); dto.setTargetField(originalPo.getFieldToMatch()); // 其余属性映射逻辑可在此补充 return dto; }) // 过滤映射失败的空值 + 校验属性匹配 .filter(Objects::nonNull) .filter(dto -> dto.getTargetField() != null && matchStrSet.contains(dto.getTargetField())) .collect(Collectors.toList()); } }
注意事项
- 若对象映射逻辑复杂,可单独封装为
convert方法,在map算子中直接引用方法引用简化代码 - 大数量级场景下可考虑使用
parallelStream并行流提升处理速度,需注意线程安全问题 - 如果需要保留原始缓存对象,可在
map阶段返回二元组结构,后续filter后按需取值
内容的提问来源于stack exchange,提问作者Nico AtSistemas
相关产品推荐
相关产品推荐

