Создание экземпляров объектов из файла с использованием Java Stream

#java #arrays #collections #java-8 #java-stream

#java #массивы #Коллекции #java-8 #java-stream

Вопрос:

Я нахожусь в процессе изучения Java 8 Stream API, и было что-то, что я пробую, и я просто не могу приступить к работе. По сути, у меня есть файл, содержащий строки следующим образом:

0132435, Джон, Доу, 30000.00

Где первая часть — это идентификатор сотрудника, вторая — имя, третья — фамилия, а четвертая — годовая зарплата, разделенная запятыми. Я пытаюсь прочитать этот файл построчно, передать всю строку статическому методу с именем parse, который создаст экземпляр каждого сотрудника, затем вернет этого сотрудника, затем я хочу сохранить всех этих сотрудников в какой-то список или массив, чтобы я мог анализировать данные. Я пытаюсь сделать все это с помощью Java stream, но у меня возникают трудности, и я не знаю, почему мой код не хочет компилироваться. Пожалуйста, имейте в виду, что я очень новичок в этом, заранее благодарю вас. Вы можете найти код для метода stream и parse ниже.

метод синтаксического анализа

 public static Employee parse(String s) 
    { 
        String[] empData = s.split(","); 
        Employee newEmp = new Employee(Integer.parseInt(empData[0]), empData[1], empData[2], BigDecimal.valueOf(Double.parseDouble(empData[3]))); 
        
        return newEmp;
    }  

  

попытка потока

 //try with resources 
try(Stream<String> stream = Files.lines(Paths.get(fileName))){ 
    stream.forEach(Employee::parse).collect(Collectors.toList());
} 
catch(IOException e) 
{ 
    e.printStackTrace();
} 
  

Комментарии:

1. Это данные CSV (значения, разделенные запятыми), поэтому забудьте о потоках Java и используйте анализатор CSV .

Ответ №1:

У вас есть правильная идея, но вам нужно использовать map , чтобы получить поток Employee s, который вы можете затем собрать:

 List<Employee> employees = 
    Files.lines(Paths.get(fileName)).map(Employee::parse).collect(Collectors.toList());
  

Комментарии:

1. Хотя этот однострочник выглядит красиво, abdcg был прав, поместив поток в инструкцию try-with-resources, поскольку поток поддерживается открытым файлом.