微服务之间调用外键“翻译”的方法概述

写在前面的话:减少strean流操作,减少多层嵌套for循环。使用普通for循环和map的方式进行转换,

第一步查询数据

java 复制代码
List<Student> findList = studentDao.findList(findMap);

第二步准备遍历和赋值

java 复制代码
if(CollectionUtil.isNotEmpty(findList)){
            // 第一次遍历,取出所有待翻译的字段,避免重复使用steam流取值
            Set<String> courseSet = new HashSet<>(16);
            Set<String> schooldSet = new HashSet<>(16);
            Set<String> nativePlaceSet = new HashSet<>(16);
            for (Student student : findList) {
                // 课程id
                String courseId = student.getSourceId();
                if(StringUtil.isNotEmpty(courseId)){
                    courseSet.add(courseId);
                }
                // 学校id
                String schooldId = student.getSchoold();
                if(StringUtil.isNotEmpty(schooldId)){
                    schooldSet.add(schooldId);
                }
                // 籍贯id
                String nativePlaceId = student.getNativePlace();
                if(StringUtil.isNotEmpty(nativePlaceId)){
                    nativePlaceSet.add(nativePlaceId);
                }
            }
            // 查询课程信息、学校信息、籍贯信息,并转换成map
            Map<String,Object> findMap = new HashMap<>(16);
            findMap.put("courseSet",courseSet);
            findMap.put("schooldSet",schooldSet);
            findMap.put("nativePlaceSet",nativePlaceSet);
            List<Course> courseList = courseDao.findList(findMap);
            List<Schoold> schooldList = schooldDao.findList(findMap);
            List<NativePlace> nativePlaceList = nativePlaceDao.findList(findMap);
            // 转换成map
            Map<String,Course> courseMap = CollectionUtil.isEmpty(courseList) ? new HashMap<>(0) :
                    courseList.stream().collect(Collectors.toMap(Course::getId, course -> course));
            Map<String,Schoold> schooldMap = CollectionUtil.isEmpty(schooldList) ? new HashMap<>(0) :
                    courseList.stream().collect(Collectors.toMap(Schoold::getId, schoold -> schoold));
            Map<String,NativePlace> nativePlaceMap = CollectionUtil.isEmpty(nativePlaceList) ? new HashMap<>(0) :
                    courseList.stream().collect(Collectors.toMap(NativePlace::getId, nativePlace -> nativePlace));
            // 第二次遍历,填充翻译后的值
            for (Student student : findList) {
                // 课程id-->课程名称
                String courseId = student.getSourceId();
                if(StringUtil.isNotEmpty(courseId)){
                    student.setSourceName(courseMap.get(courseId).getName());
                }
                // 学校id-->学校名称
                String schooldId = student.getSchoold();
                if(StringUtil.isNotEmpty(schooldId)){
                    student.setSchooldName(schooldMap.get(schooldId).getName());
                }
                // 籍贯id-->籍贯名称
                String nativePlaceId = student.getNativePlace();
                if(StringUtil.isNotEmpty(nativePlaceId)){
                    student.setNativePlaceName(nativePlaceMap.get(nativePlaceId).getName());
                }
            }
        }

结语:仅遍历2次,减少了stream流取值。用转map的方式减少了多层for循环。

使用阿里的"通益千问",指定java17将代码优化如下:

java 复制代码
List<Student> findList = studentDao.findList(findMap);
if (CollectionUtil.isNotEmpty(findList)) {
    // 单次遍历收集所有ID(性能优化核心)
    Set<String> courseSet = new HashSet<>(16);
    Set<String> schoolSet = new HashSet<>(16);
    Set<String> nativePlaceSet = new HashSet<>(16);
    for (Student student : findList) {
        addIfNotEmpty(courseSet, student.getSourceId());
        addIfNotEmpty(schoolSet, student.getSchoold());
        addIfNotEmpty(nativePlaceSet, student.getNativePlace());
    }

    // 构建查询参数
    Map<String, Object> queryMap = new HashMap<>(16);
    queryMap.put("courseSet", courseSet);
    queryMap.put("schoolSet", schoolSet); // 修正拼写错误
    queryMap.put("nativePlaceSet", nativePlaceSet);

    // 查询关联数据
    List<Course> courseList = courseDao.findList(queryMap);
    List<School> schoolList = schoolDao.findList(queryMap); // 修正类名
    List<NativePlace> nativePlaceList = nativePlaceDao.findList(queryMap);

    // 转换为Map(使用辅助方法简化)
    Map<String, Course> courseMap = toMap(courseList, Course::getId);
    Map<String, School> schoolMap = toMap(schoolList, School::getId);
    Map<String, NativePlace> nativePlaceMap = toMap(nativePlaceList, NativePlace::getId);

    // 填充学生信息(使用Optional处理空值)
    for (Student student : findList) {
        // 课程ID → 课程名称
        String courseId = student.getSourceId();
        student.setSourceName(
            courseMap.getOrDefault(courseId, new Course()).getName()
        );

        // 学校ID → 学校名称
        String schoolId = student.getSchoold();
        student.setSchooldName(
            schoolMap.getOrDefault(schoolId, new School()).getName()
        );

        // 籍贯ID → 籍贯名称
        String nativePlaceId = student.getNativePlace();
        student.setNativePlaceName(
            nativePlaceMap.getOrDefault(nativePlaceId, new NativePlace()).getName()
        );
    }
}

// 辅助方法:简化字段添加逻辑
private void addIfNotEmpty(Set<String> set, String value) {
    if (StringUtil.isNotEmpty(value)) {
        set.add(value);
    }
}

// 辅助方法:将列表转换为Map(避免重复代码)
private <T> Map<String, T> toMap(List<T> list, Function<T, String> keyExtractor) {
    return list.stream()
        .collect(Collectors.toMap(keyExtractor, Function.identity(), 
            (existing, replacement) -> existing));
}
相关推荐
Serendipity26129 分钟前
微服务架构
前端·微服务
GEM的左耳返2 小时前
Java面试实战:从基础到架构的全方位技术交锋
spring boot·微服务·云原生·java面试·技术解析·ai集成
超级小忍4 小时前
Spring Cloud Gateway:微服务架构下的 API 网关详解
微服务·云原生·架构
要开心吖ZSH4 小时前
【Spring Cloud Gateway 实战系列】高级篇:服务网格集成、安全增强与全链路压测
spring cloud·微服务·gateway·istio
Code季风5 小时前
深入理解令牌桶算法:实现分布式系统高效限流的秘籍
java·算法·微服务
java叶新东老师6 小时前
四、搭建springCloudAlibaba2021.1版本分布式微服务-加入openFeign远程调用和sentinel流量控制
分布式·微服务·sentinel
java叶新东老师6 小时前
五、搭建springCloudAlibaba2021.1版本分布式微服务-gateway网关
分布式·微服务·gateway
Kookoos6 小时前
ABP VNext + Elastic APM:微服务性能监控
微服务·云原生·架构·abp vnext·elastic apm
●VON7 小时前
重生之我在暑假学习微服务第二天《MybatisPlus-下篇》
java·学习·微服务·架构·mybatis-plus
武子康15 小时前
Java-80 深入浅出 RPC Dubbo 动态服务降级:从雪崩防护到配置中心秒级生效
java·分布式·后端·spring·微服务·rpc·dubbo