Java 使用流读取文件并跟踪当前索引

Java 使用流读取文件并跟踪当前索引,java,android,lambda,java-8,Java,Android,Lambda,Java 8,我正在阅读这样一个大文件: try (Stream<String> stream = Files.lines(Paths.get(fileName))) { stream.skip(1).forEach(Main::parseLine); } catch (IOException e) { e.printStackTrace(); } 我还想做的是跟踪我正在阅读的当前行,让parseLine看起来像这样: private static void parseLine(

我正在阅读这样一个大文件:

try (Stream<String> stream = Files.lines(Paths.get(fileName))) {
    stream.skip(1).forEach(Main::parseLine);
} catch (IOException e) {
    e.printStackTrace();
}
我还想做的是跟踪我正在阅读的当前行,让
parseLine
看起来像这样:

private static void parseLine(String line, int idx) {
    System.out.println(line);
}

如何执行此操作?

将行收集到列表中,然后使用
IntStream.range
或显式的
for
循环调用将元素与索引一起传递的方法:

List<String> result = stream.skip(1).collect(Collectors.toList());    
IntStream.range(0, result.size())
         .forEach(i -> parseLine(result.get(i), i));
List result=stream.skip(1).collect(Collectors.toList());
IntStream.range(0,result.size())
.forEach(i->parseLine(result.get(i),i));

另一种选择是使用API。

您可以使用自定义使用者实现,它通过使用计数器变量跟踪索引:

stream.skip(1).forEach(new Consumer<String>(){
    private final long counter = 0L;

    @Override
    public void accept(String line){
        parseLine(line, counter++);
    }
});
stream.skip(1).forEach(新消费者(){
专用最终长计数器=0L;
@凌驾
公共无效接受(字符串行){
parseLine(line,counter++);
}
});
stream.skip(1).forEach(new Consumer<String>(){
    private final long counter = 0L;

    @Override
    public void accept(String line){
        parseLine(line, counter++);
    }
});