#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, поскольку поток поддерживается открытым файлом.