如何使用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
相关产品推荐
相关产品推荐

