我想读取一个文本文件,处理每一行的字符串,添加一个变量,然后继续。例如:我有一个文本文件,有三行,我想添加一个变量到每一行的末尾,每一行都加一。
为了打破一切,我做了一个示例程序,但我仍然没有得到完全背后。
我的文本文件"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){
}
先谢谢你了。
2条答案
按热度按时间nnsrf1az1#
一般来说,创建lambda表达式的时间和地点与执行的时间和地点不同。有时,一个lambda表达式在方法A中创建,半分钟或几小时后在方法B中执行。2而且它可能在不同的线程上执行。3所以写方法作用域的变量是不明智的(即,仅在执行方法时存在的堆栈变量)。允许对这些变量进行读访问,因为它们的值在创建时被“复制”到lambda表达式中。
在您的情况下,给予流并使用
Files.lines(...)
的List
版本可能更容易,因此您可以通过for循环进行迭代:7fhtutme2#
如果要对此任务使用流,可以创建特定的String使用者https://docs.oracle.com/javase/8/docs/api/java/util/function/Consumer.html