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
相关产品推荐
相关产品推荐

