我有一个文本文件,我读入了一个字符串列表。之后,我试图获得其中一个字符串,修改它,并在列表中再次替换它。
我的文本文件看起来如下:
a/0/0/0/0
b/0/0/0/0
c/0/0/0/0
d/0/0/0/0
代码如下所示:
String startOfLine = "b";
List<String> lines = new ArrayList<>();
try (Stream<String> stream = Files.lines(Paths.get("pathToMyTextFile.txt"))) {
lines = stream.toList();
} catch (IOException e) {
e.printStackTrace();
}
int index = 0;
int count = 0;
String modifiedString = "";
for (String s:lines) {
count++;
if (s.startsWith(startOfLine)){
String[] splitS = s.split("/");
int increment = Integer.parseInt(splitS[2]) + 1;
modifiedString =
splitS[0] + "/" +
splitS[1] + "/" +
increment + "/" +
splitS[3] + "/" +
splitS[4];
index = count;
}
}
lines.set(index, modifiedString);
我尝试做的是在列表中得到以字母“B”开头的字符串。
将第二个"/"
之后的"0"
增加到"1"
,然后再次将字符串放在一起以替换列表中的旧值。
发生的情况是IntelliJ(我正在使用的)抱怨一个不可变的对象被修改了。我几乎可以肯定,这应该是在流本身的第一个位置获得的,但似乎不能自己完成它。在将流转换为列表之前,是否可以在流中更改以b
开头的行的值?
1条答案
按热度按时间de90aj5v1#
终端操作
toList()
生成一个数组,该数组被转换为一个List
,然后被 Package ,生成的UnmodifiableList
被与UnmodifiableList
会覆写所有变异行为,包括set()
方法,因此会掷回UnsupportedOperationException
。确保从流生成的集合可修改的唯一方法是使用
Collectors.toCollection()
:或者,要处理流中的数据,可以使用Java 16操作
mapMulti()
,它允许将命令性逻辑合并到流中:第一次
对于早于16的JDK版本,可以使用旧的
map()
操作来代替mupMalti()
,但在这种情况下,引入一个更清晰的委托方法。***旁注:**
Files.lines().toList()
* 是Files.readAllLines()
的等价物,它会生成List
(请注意,它也不保证是可修改的)。