拆分行并使用Java 8 Streams

时间:2015-10-21 15:18:48

标签: java java-8

我有一个大文件,格式如下: -

  

第一线
  第二行
  第三线
  第四行
  第五行
  Data1; Data2; Data3
  Data1; Data2; Data3
  Data1; Data2; Data3
  ....   ....

我希望我的代码跳过前5行,然后对于其余的行,它会将行拆分为&#39 ;;'并与第三项进行一些字符串比较。我希望将Java 8 Streams用于此目的,但无法弄清楚如何正确地解决它。我已经使用BufferedReader做了我想做的事情,代码如下: -

try (BufferedReader reader = Files.newBufferedReader(dictionaryPath)) {
            String line;
            reader.readLine();
            reader.readLine();
            reader.readLine();
            reader.readLine();
            reader.readLine();
            while ((line = reader.readLine()) != null) {
                String[] dictData = line.split(";");
                if (data.equals(dictData[2])) {
                    System.out.println("Your Data Item is: " + dictData[0]);
                    break;
                }
            }
        }

但我不确定如何使用Java 8流实现与上面相同的功能。我正在尝试以下内容:

try (Stream<String> lines = Files.lines(dictionaryPath)) {
         lines.skip(5).map(line -> line.split(";")).flatMap(Arrays::stream)

但无法理解更多。我希望得到一些帮助。

2 个答案:

答案 0 :(得分:9)

您可以尝试这样的事情:

Files.lines(dictionaryPath)
        .skip(5) // skip first five lines
        .map(line -> line.split(";")) // split by ';'
        .filter(dictData -> data.equals(dictData[2])) // filter by second element
        .findFirst() // get first that matches and, if present, print it
        .ifPresent(dictData -> System.out.println("Your Data Item is: " + dictData[0]));

答案 1 :(得分:1)

您不想拨打flatMap,因为这会为您提供一个条目流,而您无法正确处理它们。相反,你想要

  1. 在谓词data.equals(dictData [2])
  2. 上过滤生成的数组
  3. 映射已过滤的数组,以便获得第一个元素
  4. 对于每个元素,打印相应的消息。