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