Как можно замапить стрим в новые объекты? Или, эти примеры что не равнозначны?
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;
}
в первом случае у меня все замапилось одним объектом
При выполнении строчки
list.stream().map(new SomeObject()::convertToSomeObject)
происходит следующее:
map
создаётся новый объект SomeObject
map
Здесь объект SomeObject
создаётся ровно один раз, и так как его метод convertToSomeObject
всегда возвращает единственный созданный экземпляр, то и получается, что новый поток состоит из ссылок на один и тот же объект. При этом метод convertToSomeObject
вызывался для каждого элемента потока и каждый раз значения полей объекта перезаписывались
При выполнении строчки
list.stream().map(item -> new SomeObject().convertToSomeObject(item))
происходит следующее:
SomeObject
до вызова map
не создаётсяmap
передаётся лямбда-функция, которая работает как обычная функция:
item
SomeObject
convertToSomeObject
у созданного экземпляраconvertToSomeObject
, то есть только что созданный экземпляр класса SomeObject
написать конструктор SomeObject
, принимающий Item
в качестве параметра:
public SomeObject(Item item) {
this.name = item.getName();
}
list.stream().map(SomeObject::new)
добавить в класс SomeObject
статический метод, принимающий Item
и возвращающий SomeObject
:
public static SomeObject convertToSomeObject(Item item) {
SomeObject object = new SomeObject();
object.name = item.getName();
return object;
}
list.stream().map(SomeObject::convertToSomeObject)
Перенести метод convertToSomeObject
в класс Item
:
public SomeObject convertToSomeObject() {
SomeObject object = new SomeObject();
object.name = this.getName();
return object;
}
list.stream().map(Item::convertToSomeObject)
В данном случае эти примеры не равнозначны:
new SomeObject()::convertToSomeObject
- здесь один раз создаётся новый объект SomeObject
и передаётся ссылка на метод convertToSomeObject
конкретно этого объектаitem -> new SomeObject().convertToSomeObject(item)
- здесь для каждого элемента создаётся свой объект SomeObject
и уже у него вызывается методДля использования ссылки на метод с поведением, как во втором случае, нужно создавать новый объект внутри этого метода, например, так:
public static SomeObject convertToSomeObject(Item item) {
SomeObject object = new SomeObject();
object.name = item.getName;
object.value = item.getValue;
return object;
}
и затем использовать как list.stream().map(SomeObject::convertToSomeObject)
.
Кофе для программистов: как напиток влияет на продуктивность кодеров?
Рекламные вывески: как привлечь внимание и увеличить продажи
Только скачал архив GlassFish 50 - Full Platform, разархивировал его, запускаю через командную строку
Задача такая при наведении на элемент менять его backgroundColor, после того как отводишь мышку, должно возвращаться старое значение backgroundColor
Есть кнопка отправки формы buttonПо клику на нее в конце должно появляться модальное окно
Здравствуйте! Сделал анимации, работают, но после окончания анимации, элемент возвращается на стартовую позицию ( 0% )Вопрос: как сделать так,...