修改字符串值并在字符串列表中替换它java

2fjabf4q  于 2022-11-20  发布在  Java
关注(0)|答案(1)|浏览(152)

我有一个文本文件,我读入了一个字符串列表。之后,我试图获得其中一个字符串,修改它,并在列表中再次替换它。
我的文本文件看起来如下:

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开头的行的值?

de90aj5v

de90aj5v1#

终端操作toList()生成一个数组,该数组被转换为一个List,然后被 Package ,生成的UnmodifiableList被与

default List<T> toList() {
    return (List<T>) Collections.unmodifiableList(new ArrayList<>(Arrays.asList(this.toArray())));
}

UnmodifiableList会覆写所有变异行为,包括set()方法,因此会掷回UnsupportedOperationException
确保从流生成的集合可修改的唯一方法是使用Collectors.toCollection()

List<String> lines = Collections.emptyList();
try (Stream<String> stream = Files.lines(Paths.get("pathToMyTextFile.txt"))) {
    lines = stream.collect(Collectors.toCollection(ArrayList::new));
} catch (IOException e) {
    e.printStackTrace();
}

或者,要处理流中的数据,可以使用Java 16操作mapMulti(),它允许将命令性逻辑合并到流中:
第一次
对于早于16的JDK版本,可以使用旧的map()操作来代替mupMalti(),但在这种情况下,引入一个更清晰的委托方法。

***旁注:**Files.lines().toList() * 是 Files.readAllLines() 的等价物,它会生成List(请注意,它也不保证是可修改的)。

相关问题