【发布时间】:2016-07-28 17:32:57
【问题描述】:
我正在尝试创建一个简单的解析工具,用于转换两列 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]));
}
如您所见,我正在创建一个字符串流,用逗号分隔每一行并将其转换为字符串数组,最后将键映射到索引 0,将值映射到索引 1。
@Test
public void testGetMapFromCSV() throws IOException{
actual = util.getMapFromCSV(filePath).get("AL");
expected = "ALABAMA";
assertEquals(expected, actual);
}
由于某种原因,当我运行此测试时,实际值为 null。我排除了无效的文件路径,因为它在另一个单元测试中工作正常,并且键值存在于 CSV 中。我已经盯着它看了几个小时,想也许这里有人可以指出我的错误。
另外,我对 Java 8 还很陌生,所以如果有人知道更好/更简洁的编写方式,我将不胜感激。
【问题讨论】:
-
你在这里泄露了一个文件描述符。
Files.lines()应该在 try-with-resources 语句中打开。 -
文件中有空格吗?
-
null可能暗示map.get(key)在地图中找不到key。尝试打印util.getMapFromCSV(filePath)返回的整个地图。 -
@fge 没有 collect() 关闭流?
-
不,它没有。它消耗所有元素但不调用
.close()。你必须自己做。 (顺便说一下,实现AutoCloseable的是BaseStream,而Stream扩展了BaseStream)
标签: java csv lambda java-8 java-stream