如何在没有POJO类方法的Java流中使用Collectors.groupingBy

时间:2019-02-07 20:16:49

标签: java java-8 java-stream

我正在读取单个csv文件(大小约为700 MB,具有103415834行),并尝试检索具有某些特定值的所有行。 如果行只有1个条目,但行超过1个,则无法检索。 下面是我的代码,适合1个条目。

    try (Stream<String> stream = Files.lines(Paths.get(IN_FILE_PATH))) {

        int nameIndex = columns.indexOf("Rate");

        Stream<String> stream1 = Files.lines(Paths.get(IN_FILE_PATH));

        List<List<String>> values = stream1
                .skip(1)
                .map((line) -> Arrays.asList(line.split(",")))
                .filter(list -> list.get(nameIndex).equals("25"))
                .collect(Collectors.toList());

        System.out.println(values.size());
        values.forEach((l) -> System.out.println(l));

    } catch (IOException e1) {
        e1.printStackTrace();
    }

下面是要解析的csv文件的示例行:

MD,URN,PremiseType,Rate,OHP 09022,null,Residential,14,null 38329,1428275,Residential,14,null 38742,563459,Single,21,111

1 个答案:

答案 0 :(得分:1)

这里是按Rate(arr [3])分组的,但是您可以按需要的任何字段分组:

Map<String, List<String>> map = Files.lines(Paths.get(IN_FILE_PATH))
            .skip(1)
            .map(line -> line.split(","))
            .collect(groupingBy(arr -> arr[3], 
                     mapping(strings -> String.join(" ", strings), toList())));

结果map中的键是您按其分组的字段(在本例中为Rate),值(List<String>)是具有相同Rate的行的列表。

希望这对您有帮助