You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.05 04:09:03