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

Java 8代码优化:单Map实现学生爱好输出(无爱好显示NA)

优化Java 8处理学生爱好的代码实现

需求说明

处理JSON格式的学生列表数据,为每个学生输出其爱好(多个爱好用分号分隔);若学生无爱好字段或爱好为空,则显示NA。当前实现使用了两个Map,需要优化以简化逻辑、减少中间对象。

JSON示例

{
    "students":[
        {
            "fullName":"AAAAA",
            "standard":10,
            "hobbies":[
                "programming",
                "reading"
            ]
        },
        {
        }
    ]
}

当前Java 8实现代码

Map<String, List<Student>> studentMap = reportCard.getStudents().stream().collect(Collectors.groupingBy(Student::getFullName));
Map<String, String> studentMap2 = new TreeMap<>();
studentMap.keySet().forEach(key -> Optional.ofNullable(studentMap.get(key).get(0).getHobbies())
                        .ifPresentOrElse(hobbies -> studentMap2.put(key, hobbies.stream().map(String::trim).collect(Collectors.joining(";"))), () -> studentMap2.put(key, "NA")));

优化方案

场景1:fullName为学生唯一标识

原代码中分组后仅取每个分组的第一个元素,说明fullName是学生的唯一标识,此时分组操作完全冗余,可直接通过Collectors.toMap一步完成收集:

Map<String, String> studentHobbyMap = reportCard.getStudents().stream()
    .collect(Collectors.toMap(
        Student::getFullName,
        student -> Optional.ofNullable(student.getHobbies())
            .map(hobbies -> hobbies.stream().map(String::trim).collect(Collectors.joining(";")))
            .orElse("NA"),
        // 若存在重复fullName,此处定义合并规则,示例为保留原有值
        (existing, newVal) -> existing,
        TreeMap::new
    ));

优化点:

  • 移除冗余的分组操作,直接从学生流生成目标TreeMap,减少中间集合的创建与遍历。
  • 用Optional.map()+orElse()简化爱好的空值处理逻辑,代码更紧凑易读。
  • 直接指定结果容器为TreeMap,无需额外初始化后再填充。

场景2:存在重复fullName的学生

若业务中允许同一个fullName对应多个学生,可在分组时直接完成爱好的处理与合并:

Map<String, String> studentHobbyMap = reportCard.getStudents().stream()
    .collect(Collectors.groupingBy(
        Student::getFullName,
        TreeMap::new,
        Collectors.mapping(
            student -> Optional.ofNullable(student.getHobbies())
                .map(hobbies -> hobbies.stream().map(String::trim).collect(Collectors.joining(";")))
                .orElse("NA"),
            // 合并同fullName学生的爱好,示例用逗号分隔
            Collectors.joining(", ")
        )
    ));

优化点:

  • 将分组与爱好处理合并为一个流操作,避免额外遍历分组后的Map。
  • 可自定义同fullName学生的爱好合并规则,适配实际业务需求。

内容的提问来源于stack exchange,提问作者astar

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 05:40:37