Читать данные из файла с помощью Java 8?

Я пытаюсь преобразовать этот фрагмент кода в 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);
    }

Он уже выглядит чистым. Если вы хотите изучить Stream API, изучите учебник, доступный здесь и здесь.

Arvind Kumar Avinash 13.12.2020 17:43

Что делать, если в имени ученика стоит запятая?

Klitos Kyriacou 13.12.2020 18:27
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
2
75
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Что-то вроде этого:

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. Мне нужно получить значения с помощью геттеров.

Enyedi David 13.12.2020 17:53

@EnyediDavid Не уверен, что вы имеете в виду, почему этот код не позволяет вам использовать методы получения? И зачем вам что-то получать в коде, который вы разместили? Если есть другой аспект вопроса, относящегося к классу Student, опубликуйте этот код и соответствующим образом измените вопрос.

stridecolossus 13.12.2020 17:57

Я только что добавил, что я хочу делать с методами получения. Я новичок, поэтому не могли бы вы объяснить вспомогательный метод loadStudent(String[]). Объясняя, я имею в виду, как я могу использовать это, чтобы получить те же результаты.

Enyedi David 13.12.2020 18:17

Вспомогательный метод Student loadStudent(String[] data) можно заменить конструктором в классе Student: public Student(String[] data), который позже можно будет назвать .map(Student::new)

Nowhere Man 13.12.2020 18:22

Я добавил схему вспомогательного метода к ответу, должно (надеюсь) быть очевидным, как реорганизовать код, который у вас уже есть, в новый метод, или следовать предложению @AlexRudenko. Я до сих пор не понимаю вашего вопроса о геттерах, поскольку новый код является просто потоковым эквивалентом опубликованного вами императивного цикла, я ожидаю, что класс Student не будет затронут.

stridecolossus 13.12.2020 18:22

Мне удалось решить проблему. Теперь я знаю, что мой вопрос о геттерах был глупым. Простите за это. Спасибо за помощь!

Enyedi David 13.12.2020 18:41

Другие вопросы по теме