You need to enable JavaScript to run this app. 如何使用Java 8 Stream改写学生成绩文件读取与满分学生筛选的传统代码
优惠活动
大模型
产品
解决方案
定价
更多

如何使用Java 8 Stream改写学生成绩文件读取与满分学生筛选的传统代码

Java 8 Stream风格代码改写实现

processFile 方法(文件解析+排序)

完全沿用原实现的字段解析、异常处理、排序规则,仅替换手动循环逻辑为Stream操作:

@Override
public List<Student> processFile(String filename) {
    List<Student> students = new ArrayList<>();
    // 用try-with-resources自动关闭文件流,替代原手动管理的BufferedReader
    try (BufferedReader reader = Files.newBufferedReader(Paths.get(filename))) {
        // 逐行读取文件内容,forEach逻辑与原while循环完全对齐
        reader.lines().forEach(line -> {
            String[] splitLine = line.split(",");
            String name = splitLine[0];
            String gender = splitLine[1];
            // 用IntStream生成成绩数组,替代原手动循环赋值逻辑
            int[] grades = IntStream.range(2, splitLine.length)
                    .map(index -> Integer.parseInt(splitLine[index]))
                    .toArray();
            students.add(new Student(name, gender, grades));
        });
    } catch (Exception e) {
        // 完全沿用原异常处理逻辑:打印堆栈,不中断已处理数据的后续流程
        e.printStackTrace();
    }
    // 沿用原姓名升序排序逻辑
    students.sort(Comparator.comparing(Student::getName));
    return students;
}

printStudentsWithTens 方法(筛选打印含10分的学生)

原实现已使用Stream,本次优化为更简洁的写法,输出逻辑完全与原实现对齐:

private void printStudentsWithTens(List<Student> students) {
    String joinedNames = students.stream()
            // 筛选规则:成绩数组中存在10分
            .filter(student -> Arrays.stream(student.getGrades()).anyMatch(grade -> grade == 10))
            // 姓名处理规则:取空格分隔的第一部分
            .map(student -> student.getName().split(" ")[0])
            .collect(Collectors.joining(", "));
    System.out.println("Name of Students with tens: " + joinedNames);
}

所有业务逻辑与原代码100%对齐,仅替换手动循环、手动资源管理的实现为Java 8原生Stream与自动资源管理能力。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.11.13 01:36:04