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

问题描述

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

this image

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

解决方法

concat返回一个新字符串,但是forEach忽略lambda表达式的返回值。 (其声明的参数为eps,没有返回值。)

replaceAll将其函数的返回值放回列表中。那就是它的目的。

,

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

,

.forEach()接受列表中的每个元素,然后应用该功能。通常,您将调用对象的函数。在这种情况下,您会将返回的值丢弃,并且不会更改对象。

.replaceAll()接受列表中的每个元素并应用一个函数。之后,将在特定位置设置返回值。

.concat()不会由于字符串不可更改而更改字符串引用,但会在新的引用中返回更改后的字符串。

,

名称确切说明了方法的作用。

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

replaceAll将所有数组成员传递给该函数,并检查该函数返回的对象,并且当然将该对象存储回该数组,这意味着替换。请注意,在此方法中,函数必须返回一个对象。如果是String.concat,则返回串联的String,因此串联的String出现在数组中。

,

我认为是因为

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