Я пытаюсь преобразовать этот фрагмент кода в Java 8 с потоками. Я читаю из файла, который имеет 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;
}
После этого я хочу получить студентов с десятками, что я делаю следующим образом:
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);
}
Что делать, если в имени ученика стоит запятая?
Что-то вроде этого:
try(BufferedReader r = new BufferedReader(new FileReader(new File(filename)))) {
return r.lines()
.map(line -> line.split(","))
.map(this::loadStudent)
.sorted(Comparator.comparing(Student::getName))
.collect(toList());
}
...
private static Student loadStudent(String[] splitline) {
// TODO - the grades code you already have
return new Student(splitline[0], splitline[1], grades);
}
Спасибо за ваш ответ! Проблема в том, что я не смогу получить значения из методов получения из класса Student. Мне нужно получить значения с помощью геттеров.
@EnyediDavid Не уверен, что вы имеете в виду, почему этот код не позволяет вам использовать методы получения? И зачем вам что-то получать в коде, который вы разместили? Если есть другой аспект вопроса, относящегося к классу Student
, опубликуйте этот код и соответствующим образом измените вопрос.
Я только что добавил, что я хочу делать с методами получения. Я новичок, поэтому не могли бы вы объяснить вспомогательный метод loadStudent(String[]). Объясняя, я имею в виду, как я могу использовать это, чтобы получить те же результаты.
Вспомогательный метод Student loadStudent(String[] data)
можно заменить конструктором в классе Student
: public Student(String[] data)
, который позже можно будет назвать .map(Student::new)
Я добавил схему вспомогательного метода к ответу, должно (надеюсь) быть очевидным, как реорганизовать код, который у вас уже есть, в новый метод, или следовать предложению @AlexRudenko. Я до сих пор не понимаю вашего вопроса о геттерах, поскольку новый код является просто потоковым эквивалентом опубликованного вами императивного цикла, я ожидаю, что класс Student
не будет затронут.
Мне удалось решить проблему. Теперь я знаю, что мой вопрос о геттерах был глупым. Простите за это. Спасибо за помощь!
Он уже выглядит чистым. Если вы хотите изучить
Stream
API, изучите учебник, доступный здесь и здесь.