问题描述
我对Arraylist.forEach()
和Arraylist.replaceAll()
之间的区别有疑问。我知道Arraylist.forEach()
用于对列表中的每个元素执行操作,但是似乎Arraylist.replaceAll()
确实做同样的事情。但是由于某些原因,当您决定进行a.forEach(e -> e.concat("test");
并假设a是一个字符串数组列表时,该数组列表不会将“测试”连接到该数组列表中每个字符串的末尾。但是,如果执行a.replaceAll(e -> e.concat("test");
,则串联有效。为什么会这样呢?我正在谈论的一个例子是这张图片:
。
答案是B,但C对我来说似乎最有意义。感谢您的帮助。
解决方法
concat
返回一个新字符串,但是forEach
忽略lambda表达式的返回值。 (其声明的参数为eps
,没有返回值。)
replaceAll
将其函数的返回值放回列表中。那就是它的目的。
请记住,字符串是不可变的。调用Consumer
时,您没有将concat
的返回值分配给任何东西,但是forEach()
却没有分配返回值,因为它每次都会覆盖当前元素。
.forEach()
接受列表中的每个元素,然后应用该功能。通常,您将调用对象的函数。在这种情况下,您会将返回的值丢弃,并且不会更改对象。
.replaceAll()
接受列表中的每个元素并应用一个函数。之后,将在特定位置设置返回值。
.concat()
不会由于字符串不可更改而更改字符串引用,但会在新的引用中返回更改后的字符串。
名称确切说明了方法的作用。
forEach将每个元素传递给函数,但是只要对象是不可变类型,它就不会修改数组成员。因此,它期望该函数没有返回值(无效)。数组始终保持不变。字符串类型是不可变的,因此任何更改都不会影响保持在数组中的对象。
replaceAll将所有数组成员传递给该函数,并检查该函数返回的对象,并且当然将该对象存储回该数组,这意味着替换。请注意,在此方法中,函数必须返回一个对象。如果是String.concat,则返回串联的String,因此串联的String出现在数组中。
,我认为是因为
- a.forEach遍历arrayList中的每个元素,然后Concat返回一个新字符串。它不会更改arrayList中的原始字符串。
- a.Replaceall将替换arrayList中的原始字符串。