java 正在使用流阅读文本文件-lambda表达式中的变量

3zwtqj6y  于 2022-12-21  发布在  Java
关注(0)|答案(2)|浏览(102)

我想读取一个文本文件,处理每一行的字符串,添加一个变量,然后继续。例如:我有一个文本文件,有三行,我想添加一个变量到每一行的末尾,每一行都加一。
为了打破一切,我做了一个示例程序,但我仍然没有得到完全背后。
我的文本文件"test.txt"有三行文本"第一行","第二行"和"第三行",我有一个名为testNum的整数,值为500,我想在每行后向上。
我的代码如下:

String fileName = "test.txt";
int testNum = 1024;

Stream<String> readFileStream = null;
try {
    readFileStream = Files.lines(Paths.get(fileName));

} catch (IOException e) {
    e.printStackTrace();
}
readFileStream.forEach( line -> {            
    System.out.println(line+testNum);
    testNum++;
});

现在我明白了问题出在lambda表达式上,谁能解释一下为什么我需要lambda表达式的局部变量,却不能访问它外部声明的变量?
此外,我尝试更改我的代码以使用a for each代替,但for each似乎不适用于"流",例如:

for(String line : readFileStream){
}

先谢谢你了。

nnsrf1az

nnsrf1az1#

一般来说,创建lambda表达式的时间和地点与执行的时间和地点不同。有时,一个lambda表达式在方法A中创建,半分钟或几小时后在方法B中执行。2而且它可能在不同的线程上执行。3所以写方法作用域的变量是不明智的(即,仅在执行方法时存在的堆栈变量)。允许对这些变量进行读访问,因为它们的值在创建时被“复制”到lambda表达式中。
在您的情况下,给予流并使用Files.lines(...)List版本可能更容易,因此您可以通过for循环进行迭代:

List<String> lines = Files.readAllLines(Paths.get(filename));
int testNum = 500;
for(String line : lines) {
    System.out.println(line + testNum);
    testNum++;
}
7fhtutme

7fhtutme2#

如果要对此任务使用流,可以创建特定的String使用者https://docs.oracle.com/javase/8/docs/api/java/util/function/Consumer.html

String fileName = "test.txt";

Stream<String> readFileStream = null;
try {
    readFileStream = Files.lines(Paths.get(fileName));

} catch (IOException e) {
    e.printStackTrace();
}

readFileStream.forEach(
    new Consumer<String>() {
        int testNum = 1024;
        public void accept(String line) {
            try {
                System.out.println(line + testNum++);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
});

相关问题