Foreach无法操纵String列表?

cod*_*leb 3 java list immutability pass-by-value

我在主题上发现了这个主题,我想知道为什么用Java替换List中的值是如此困难.

我的代码看起来像这样丑陋:

    List<String> stringList = new ArrayList<>();
    // ... add some elements
    for (int i = 0; i< stringList.size(); ++i) {
        if (stringList.get(i).contains("%")) {
            stringList.set(i, stringList.get(i).replace("%", backupStorePath));
        }
    }
Run Code Online (Sandbox Code Playgroud)

这真的是唯一的方法吗?为什么我不能使用foreach循环?

for (String command : stringList) {
    command = command.replace("%", backupStorePath);
}
Run Code Online (Sandbox Code Playgroud)

这必须是java的"按值复制"问题而String是不可变的,但为什么它实现了呢?为什么command原始参考的副本而不是原始参考?

Tag*_*eev 5

从Java-8开始,您可以使用以下新选项List.replaceAll:

stringList.replaceAll(command -> command.replace("%", backupStorePath));
Run Code Online (Sandbox Code Playgroud)

需要注意的是for对于任何环路工程Iterable,不仅是List.并且大多数其他迭代不支持元素替换.因此,即使Java设计者决定支持修改,也有必要将List和非List案例分开,这肯定会增加一些复杂性.