Java 如何将计数器插入流<;字符串>。forEach()? FileWriter=newfilewriter(输出文件); int i=0; try(streamlines=Files.lines(path.get(input_file))){ 行。forEach(行->{ 试一试{ writer.write(i+“#”+line+System.lineSeparator()); }捕获(例外e){ e、 printStackTrace(); } } ); writer.close(); }

Java 如何将计数器插入流<;字符串>。forEach()? FileWriter=newfilewriter(输出文件); int i=0; try(streamlines=Files.lines(path.get(input_file))){ 行。forEach(行->{ 试一试{ writer.write(i+“#”+line+System.lineSeparator()); }捕获(例外e){ e、 printStackTrace(); } } ); writer.close(); },java,foreach,java-stream,line-numbers,Java,Foreach,Java Stream,Line Numbers,我需要用行号写这行,所以我尝试在.forEach()中添加一个计数器,但无法使其工作。我只是不知道把I++放在哪里;到目前为止,在代码中随机旋转没有任何帮助。您可以使用AtomicInteger作为可变的final计数器 FileWriter writer = new FileWriter(output_file); int i = 0; try (Stream<String> lines = Files.lines(Paths.get(input_file)))

我需要用行号写这行,所以我尝试在.forEach()中添加一个计数器,但无法使其工作。我只是不知道把I++放在哪里;到目前为止,在代码中随机旋转没有任何帮助。

您可以使用
AtomicInteger
作为可变的
final
计数器

FileWriter writer = new FileWriter(output_file);
    int i = 0;

    try (Stream<String> lines = Files.lines(Paths.get(input_file))) {
        lines.forEach(line -> {
            try {
                writer.write(i + " # " + line + System.lineSeparator());
            } catch (Exception e) {
                e.printStackTrace();
            }   
        }
                    );
        writer.close();
    }
public void test()引发IOException{
//确保编写器关闭。
try(FileWriter=newfilewriter(“OutFile.txt”)){
//使用AtomicInteger作为可变行计数。
最终AtomicInteger计数=新的AtomicInteger();
//确保水流关闭。
try(streamlines=Files.lines(path.get(“infle.txt”)){
行。forEach(行->{
试一试{
//用行号注释。
writer.write(count.incrementAndGet()+“#”+line+System.lineSeparator());
}捕获(例外e){
e、 printStackTrace();
}
}
);
}
}
}

这是一个很好的例子,说明您应该使用一个好的老式for循环。虽然
Files.lines()
专门提供了一个顺序流,但流可能会无序生成和处理,因此插入计数器并依赖其顺序是一个相当坏的习惯。如果您仍然真的想这样做,请记住,在任何可以使用lambda的地方,您仍然可以使用完整的匿名类。匿名类是普通类,因此可以具有状态

因此,在您的示例中,您可以这样做:

public void test() throws IOException {
    // Make sure the writer closes.
    try (FileWriter writer = new FileWriter("OutFile.txt") ) {
        // Use AtomicInteger as a mutable line count.
        final AtomicInteger count = new AtomicInteger();
        // Make sure the stream closes.
        try (Stream<String> lines = Files.lines(Paths.get("InFile.txt"))) {
            lines.forEach(line -> {
                        try {
                            // Annotate with line number.
                            writer.write(count.incrementAndGet() + " # " + line + System.lineSeparator());
                        } catch (Exception e) {
                            e.printStackTrace();
                        }
                    }
            );
        }
    }
}
FileWriter=newfilewriter(输出文件);
try(streamlines=Files.lines(path.get(input_file))){
lines.forEach(新消费者(){
int i=0;
无效接受(字符串行){
试一试{
writer.write((i++)+“#”+line+System.lineSeparator());
}捕获(例外e){
e、 printStackTrace();
}
}
});
writer.close();
}
如中所述:

使用的任何局部变量、形式参数或异常参数 在lambda表达式中未声明的必须声明为final或final 实际上是最终的(§4.12.4),否则在以下情况下会发生编译时错误: 已尝试使用

这意味着您的变量必须是最终变量或有效的最终变量。您希望在
forEach
中添加一个计数器,为此,您可以使用OldCurumudgeon建议的
AtomicInteger
,这是我的首选方法

我相信您也可以使用只有一个值
0
的数组作为计数器。检查并让我知道以下示例是否适用于您:

FileWriter writer = new FileWriter(output_file);

try (Stream<String> lines = Files.lines(Paths.get(input_file))) {
    lines.forEach(new Consumer<String>() {
        int i = 0;
        void accept(String line) {
            try {
                writer.write((i++) + " # " + line + System.lineSeparator());
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    });
    writer.close();
}
public void test()引发IOException{
FileWriter=newfilewriter(“OutFile.txt”);
最终int[]计数={0};
try(streamlines=Files.lines(path.get(“infle.txt”)){
行。forEach(行->{
试一试{
计数[0]++;
writer.write(计数[0]+“#”+line+System.lineSeparator());
}捕获(例外e){
e、 printStackTrace();
}
}
);
writer.close();
}
}

在循环外声明一个int,将其设置为0,并在每次迭代中增加它。@Stultuske可以这样做吗?你试过了吗?注意,这里没有任何循环,但是有一个lambda;在lambda之外,但我不能让它在每个for.each()循环中增加。Stultuske既不看代码也不看问题,只看主题。是否尝试了writer.write(i++“#”+line+System.lineSeparator());我没有在这里安装Java8,因此无法尝试。但应该有办法让它发挥作用。
public void test() throws IOException {
    FileWriter writer = new FileWriter("OutFile.txt");
    final int[] count = {0};

    try (Stream<String> lines = Files.lines(Paths.get("InFile.txt"))) {
        lines.forEach(line -> {
            try {
                count[0]++;
                writer.write(count[0] + " # " + line + System.lineSeparator());
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
        );
        writer.close();
    }
}