如何使用 Java 8 Stream 将 csv 转换为地图

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 还很陌生,所以如果有人知道更好/更简洁的写法,我会很感激反馈。

ark*_*234 7

好的,我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)