Java Streams - >从List <List <String >>中提取特定索引处的值?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (1523)

我正在阅读带有Java 8流的CSV文件,以及获取CSV文件中特定列值的最佳方法。例如。

firstName,lastName,age,
tom,abraham,18,
liz,abraham,15,
tonny,paul,25

我想提取第二列,因此结果集将是abraham;paul 如何通过Java 8 lambda和Streams完成的?

提问于
用户回答回答于

欢迎来到StackOverflow :)

CSV文件可以作为任何其他文本文件读取,不需要解析器,并且String::splitwith File::readAllLines足够:

Set<String> names = Files.readAllLines(Paths.get("file.csv")) // Read all lines of file
                         .stream()                            // Stream them
                         .skip(1)                             // Omit the column names (if any)
                         .map(s -> s.split(";")[1])           // Split by ; and get the 2nd column
                         .collect(Collectors.toSet());        // Collect Strings to Set

我没看好标签。如果您已经解析过List<List<String>>,获得相同结果的最简单方法是:

Set<String> names = parsedList.stream()
                              .map(row -> row.get(1))       // Get the second column
                              .collect(Collectors.toSet())  // collect to Set<String>

请注意以下事项:

  • distinct()由于收集以Set确保不同元素的定义,因此不需要该方法。如果您坚持收集List<String>,请将最后一行替换为: .... .distinct() .collect(Collectors.toList()); 这种方式适用于我建议的两种解决方案。
  • 如果出现不规则的CSV模式或转义;字符,则以下行可能会出现异常:
    • map(s -> s.split(";")[1])
    • map(list -> list.get(1))

    然后你需要使用一个解析器。

用户回答回答于
Files.readAllLines(Paths.get("my.csv")).stream()
        .skip(1)
        .map(s -> s.split(";")[1])
        .distinct()
        .collect(Collectors.toList()).forEach(System.out::println);

这是最简单的方法,但我更喜欢使用正则表达式和Matcher这种情况。

扫码关注云+社区

领取腾讯云代金券