ark*_*234 7 java csv lambda java-8 java-stream
我正在尝试创建一个简单的解析实用程序,它可以转换一个两列的 CSV 文件并将其放入地图中。
public Map<String, String> getMapFromCSV(final String filePath) throws IOException {
return Files.lines(Paths.get(filePath))
.map(line -> line.split(","))
.collect(Collectors.toMap(line -> line[0], line -> line[1]));
}
Run Code Online (Sandbox Code Playgroud)
如您所见,我正在创建一个字符串流,用逗号分隔每一行并将其转换为字符串数组,最后将键映射到索引 0,将值映射到索引 1。
@Test
public void testGetMapFromCSV() throws IOException{
actual = util.getMapFromCSV(filePath).get("AL");
expected = "ALABAMA";
assertEquals(expected, actual);
}
Run Code Online (Sandbox Code Playgroud)
出于某种原因,当我运行此测试时,实际值为空。我排除了无效的 filePath,因为它在另一个单元测试中工作正常,并且键值存在于 CSV 中。我已经盯着它看了几个小时,想也许这里有人可以指出我的错误。
另外,我对 Java 8 还很陌生,所以如果有人知道更好/更简洁的写法,我会很感激反馈。
好的,我lines.close()从 csv 中添加并删除了任何空格,它可以工作!奇怪,考虑到 csv 在我的另一种方法中解析得很好。这是它的样子:
public static Map<String, String> getMapFromCSV(final String filePath) throws IOException{
Stream<String> lines = Files.lines(Paths.get(filePath));
Map<String, String> resultMap =
lines.map(line -> line.split(","))
.collect(Collectors.toMap(line -> line[0], line -> line[1]));
lines.close();
return resultMap;
}
Run Code Online (Sandbox Code Playgroud)