Arraylist.forEach() 和 Arraylist.replaceAll() 之间的区别

Difference between Arraylist.forEach() and Arraylist.replaceAll()

我有一个关于 Arraylist.forEach()Arraylist.replaceAll() 之间的区别的问题。我知道 Arraylist.forEach() 用于对列表中的每个元素执行一个操作,但似乎 Arraylist.replaceAll() 做完全相同的事情。但出于某种原因,当您决定执行 a.forEach(e -> e.concat("test"); 假设 a 是一个字符串数组列表时,Arraylist 不会将“test”连接到 Arraylist 中每个字符串的末尾。但是,如果您执行 a.replaceAll(e -> e.concat("test");,则连接有效。为什么会这样?我正在谈论的一个例子是这张图片:

.

答案是 B,但 C 对我来说似乎最有意义。感谢您的帮助。

concat returns a new string, but forEach 忽略 lambda 表达式的 return 值。 (它声明的参数是一个 Consumer,没有 return 值。)

replaceAll 将其函数中的 return 值放回列表中。这就是它的用途。

请记住,字符串是不可变的。当您调用 forEach() 时,您没有将 concat 的 return 值分配给任何东西,但是 replaceAll() 会这样做,因为它每次都会覆盖当前元素。

.forEach() 获取列表中的每个单独元素,然后应用该函数。通常你会调用一个对象的函数。在这种情况下,您将 returned 值丢弃并且不会更改对象。

.replaceAll() 获取列表中的每个单独元素并应用一个函数。之后 returned 值将设置在特定位置。

由于字符串不变性,

.concat() 不会更改字符串引用,但它会 return 新引用中更改的字符串。

名称准确地解释了方法的作用。

forEach 将每个元素传递给函数,但只要对象是不可变类型,它就不会修改数组成员。因此,它不需要函数的 return 值(无效)。数组始终保持不变。字符串类型是不可变的,因此任何更改都不会影响数组中保存的对象。

replaceAll 将所有数组成员传递给函数并通过该函数检查对象return,当然将该对象存储回数组,即替换。请注意,在此方法中,函数必须 return 一个对象。在 String.concat 的情况下,连接的字符串被 returned 因此连接的字符串出现在数组中。

我认为这是因为

  1. a.forEach 遍历 arrayList 中的每个元素,然后连接 returns 一个新字符串。它不会更改 arrayList 中的原始字符串。
  2. a.Replaceall 将替换 arrayList 中的原始字符串。