【问题标题】:Split lines and process them by reading file using Java 8 Streams拆分行并通过使用 Java 8 Streams 读取文件来处理它们
【发布时间】:2015-10-21 15:18:47
【问题描述】:

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

第一行
二线
三线
第四行
第五线
数据1;数据2;数据3
数据1;数据2;数据3
数据1;数据2;数据3
....
....

我希望我的代码跳过前 5 行,然后对于其余的行,它将用 ';' 分隔行并与第三项进行一些字符串比较。我希望为此目的使用 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)

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

【问题讨论】:

    标签: java java-8


    【解决方案1】:

    你可以试试这样的:

    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]));
    

    【讨论】:

    • 附录:不是 100% 确定,但我认为流在操作后会自动关闭,因此可能不需要 try-with-resource。
    【解决方案2】:

    您不想调用flatMap,因为这会给您一个条目流,并且您将无法正确处理它们。相反,你想

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-04-03
      • 1970-01-01
      • 2020-09-05
      • 2013-07-17
      • 2015-05-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多