【问题标题】:Java 8: Lines Location occurrence, when filter is applied, stream, foreachJava 8:行位置发生,应用过滤器时,流,foreach
【发布时间】:2018-03-16 21:25:53
【问题描述】:

不知道有没有可能:

我想知道在 someFile 中找到 someWord 的数字行。

   try {
      CharsetDecoder dec = StandardCharsets.UTF_8.newDecoder()
          .onMalformedInput(CodingErrorAction.IGNORE);
      try (Reader r = Channels.newReader(FileChannel.open("path"), dec, -1);
          BufferedReader br = new BufferedReader(r)) {
        br.lines().filter(line -> line.contains("SomeWord"))
            .forEach(line -> System.out.println("location:" + line.????)); //Location where line has the "SomeWord"
      }
    } catch (IOException |java.io.UncheckedIOException ex) {
      Logger.getLogger(RecursiveFolderAndFiles.class.getName())
          .log(Level.SEVERE, null, ex);
    }

我该怎么做?

【问题讨论】:

    标签: foreach java-8 location java-stream lines


    【解决方案1】:

    您可以收集到一个列表,然后像这样使用IntStream.range,而不是对br.lines() 进行进一步的操作:

    ...
    ...
    List<String> resultSet = br.lines().collect(Collectors.toList());
    IntStream.range(0, resultSet.size())
             .filter(index -> resultSet.get(index).contains("SomeWord"))
             .forEach(index -> System.out.println("location:" + index));
    ...
    ...
    

    现在,您应该可以同时访问索引和行了。

    【讨论】:

      【解决方案2】:

      对于这个或 java-8,你不一定需要 Stream...有 LineNumberReader 扩展 BufferedReader,所以你可以这样做:

      LineNumberReader lnr = new LineNumberReader(r)) {
         String line;
         while ((line = lnr.readLine()) != null) {  
             if(line.contains("SomeWord")) {
                   System.out.println("location:" + lnr.getLineNumber())
             }
         }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2018-12-17
        • 1970-01-01
        • 1970-01-01
        • 2015-01-02
        • 1970-01-01
        • 1970-01-01
        • 2015-05-14
        相关资源
        最近更新 更多