java - Foreach 不能操作一个String 列表?

标签 java list immutability pass-by-value

我找到了 this关于该主题的线程,我想知道为什么在 Java 中替换列表中的值如此困难。

我的代码看起来很丑:

    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));
        }
    }

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

for (String command : stringList) {
    command = command.replace("%", backupStorePath);
}

这一定是java的“按值复制”问题,String是不可变的,但为什么要这样实现呢?为什么 command 是原始引用的副本而不是原始引用本身?

最佳答案

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

stringList.replaceAll(command -> command.replace("%", backupStorePath));

请注意,for 循环适用于任何 Iterable,而不仅仅是 List。并且大多数其他可迭代对象不支持元素替换。因此,即使 Java 设计者决定支持修改,也有必要将 List 和非 List 的情况分开,这肯定会增加一些复杂性。

关于java - Foreach 不能操作一个String 列表?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36077177/

相关文章:

java - 一次性将 gzip 文件读取到 byte[]

python - 列表 += 元组与列表 = 列表 + 元组

Linux 用户列表和 UID/bash 层

java - 如何对 hibernate 投影结果应用顺序

react-redux - Easy Peasy VS React Redux

javascript - 重新分配、变异、引用类型和值类型

scala - 如何在 scala 中获取(不可变和可变)集合的列表?

java - ArrayIndexOutOfBoundsException : 3 issue in glassfish. 如何解决?

Java Swing ;如何使程序在屏幕的最右侧启动?

java - BFS最短路径: Edge weight either 1 or 2