使用Java8从文件中读取数据?

使用Java8从文件中读取数据?,java,Java,我正在尝试将这段代码转换为带有流的Java8。我正在读取一个包含3列或更多列的文件。这取决于学生的成绩。第一列包含学生的姓名。第二个包含学生的性别。下一栏是成绩。分隔符是逗号。我希望变量中的值与下面的方法相同 @Override public List<Student> processFile(String filename) { ArrayList<Student> students = new ArrayList<>();

我正在尝试将这段代码转换为带有流的Java8。我正在读取一个包含3列或更多列的文件。这取决于学生的成绩。第一列包含学生的姓名。第二个包含学生的性别。下一栏是成绩。分隔符是逗号。我希望变量中的值与下面的方法相同

@Override
    public List<Student> processFile(String filename) {
        ArrayList<Student> students = new ArrayList<>();
        try{
            BufferedReader reader =  new BufferedReader(new FileReader( new File(filename)));
            String line = reader.readLine();
            while(line != null) {
                String[] splitline = line.split(",");
                String name = splitline[0];
                String gender = splitline[1];
                int[] grades = new int[splitline.length -2];

                for(int i = 2; i < splitline.length; i++){
                    grades[i - 2] = Integer.parseInt(splitline[i]);
                }

                students.add(new Student(name, gender, grades));
                line=reader.readLine();
            }
        } catch (Exception e){
            e.printStackTrace();
        }

        students.sort(Comparator.comparing(Student::getName));
        return students;
    }
@覆盖
公共列表进程文件(字符串文件名){
ArrayList students=新ArrayList();
试一试{
BufferedReader=new BufferedReader(new FileReader(new File(filename)));
字符串行=reader.readLine();
while(行!=null){
String[]splitline=line.split(“,”);
字符串名称=拆分行[0];
字符串性别=分割线[1];
int[]等级=新int[splitline.length-2];
对于(int i=2;i
在这之后,我想让学生用十,我用以下方法:

private void printStudentsWithTens(List<Student> students) {
        StringBuilder res = new StringBuilder("Name of Students with tens: ");
       res.append(students.stream()
                .filter(student -> Arrays.stream(student.getGrades()).anyMatch(g -> g == 10))
                .map(student -> student.getName().split(" ")[0])
                .collect(Collectors.joining(", ")));

        System.out.println(res);
    }
private void printStudentsWithTens(列出学生){
StringBuilder res=新的StringBuilder(“学生姓名加十:”);
res.append(students.stream()
.filter(student->Arrays.stream(student.getGrades()).anyMatch(g->g==10))
.map(学生->学生.getName().split(“”[0])
.collect(收集器。连接(“,”);
系统输出打印项次(res);
}
类似这样的内容:

try(BufferedReader r=new BufferedReader(new FileReader(new File(filename))){
返回r.行()
.map(直线->直线分割(“,”)
.map(此::loadStudent)
.sorted(Comparator.comparing(Student::getName))
.collect(toList());
}
...
私有静态学生加载学生(字符串[]拆分行){
//TODO-您已有的成绩代码
返回新学生(拆分行[0],拆分行[1],成绩);
}
类似这样的内容:

try(BufferedReader r=new BufferedReader(new FileReader(new File(filename))){
返回r.行()
.map(直线->直线分割(“,”)
.map(此::loadStudent)
.sorted(Comparator.comparing(Student::getName))
.collect(toList());
}
...
私有静态学生加载学生(字符串[]拆分行){
//TODO-您已有的成绩代码
返回新学生(拆分行[0],拆分行[1],成绩);
}

它看起来已经很干净了。如果你想学习
API,请学习可用的教程。如果学生的名字中有逗号,该怎么办?它看起来已经很干净了。如果你想学习
API,请从可用的教程中学习。如果学生的名字中有逗号怎么办?谢谢你的回答!问题是我无法从学生类的getter方法中获取值。我需要使用getter获取值。@EnyediDavid不确定您的意思,为什么该代码会阻止您使用getter方法?为什么你需要在你发布的代码中得到任何东西?如果问题涉及到
学生
课程的另一个方面,请发布该代码并相应地修改问题。我刚刚补充了,我想用getter方法做什么。我是一名初学者,请您解释一下loadStudent(String[])助手方法。通过解释,我的意思是,我如何使用它来获得相同的结果。助手方法
Student loadStudent(String[]data)
可以替换为
Student
class:
public Student(String[]data)
中的构造函数,该构造函数以后可以称为
.map(Student::new)
我在答案中添加了一个helper方法的大纲,应该(希望)清楚地知道如何将已有的代码重构到新方法中,或者遵循@AlexRudenko的建议。我仍然不理解你关于getter的问题,因为新代码只是你发布的命令循环的流等价物,我希望
学生
类不会受到影响。谢谢你的回答!问题是我无法从学生类的getter方法中获取值。我需要使用getter获取值。@EnyediDavid不确定您的意思,为什么该代码会阻止您使用getter方法?为什么你需要在你发布的代码中得到任何东西?如果问题涉及到
学生
课程的另一个方面,请发布该代码并相应地修改问题。我刚刚补充了,我想用getter方法做什么。我是一名初学者,请您解释一下loadStudent(String[])助手方法。通过解释,我的意思是,我如何使用它来获得相同的结果。助手方法
Student loadStudent(String[]data)
可以替换为
Student
class:
public Student(String[]data)
中的构造函数,该构造函数以后可以称为
.map(Student::new)
我在答案中添加了一个helper方法的大纲,应该(希望)清楚地知道如何将已有的代码重构到新方法中,或者遵循@AlexRudenko的建议。我仍然不理解你关于getter的问题,因为新代码只是你发布的命令循环的流等价物,我希望
Student
类不会受到影响。