微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决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中的原始字符串。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。