如何将流映射到新对象?或者,这些例子不等价?
list.stream().map(new SomeObject()::convertToSomeObject)
list.stream().map(item -> new SomeObject().convertToSomeObject(item))
public SomeObject convertToSomeObject(Item item) {
this.name = item.getName;
this.value = item.getValue;
return this;
}
在第一种情况下,一切都由一个对象映射
为什么第一个选项不起作用
执行一行时
发生以下情况:
map
,会创建一个新对象SomeObject
map
在这里,对象
SomeObject
只被创建一次,因为它的方法convertToSomeObject
总是返回唯一创建的实例,所以新的流包含对同一个对象的引用。在这种情况下,convertToSomeObject
为流的每个元素调用该方法,并且每次覆盖对象字段的值为什么第二个选项有效?
执行一行时
发生以下情况:
SomeObject
在调用之前没有map
创建对象map
,它的工作方式与常规函数类似:item
SomeObject
convertToSomeObject
在创建的实例上调用方法convertToSomeObject
,即新创建的类实例SomeObject
如何修复第一个选项
编写一个作为参数的构造
SomeObject
函数:Item
SomeObject
向接受Item
和返回的类添加一个静态方法SomeObject
:将方法移动
convertToSomeObject
到类Item
: