Как можно замапить стрим в новые объекты? Или, эти примеры что не равнозначны?
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 создаётся новый объект SomeObjectmapЗдесь объект SomeObject создаётся ровно один раз, и так как его метод convertToSomeObject всегда возвращает единственный созданный экземпляр, то и получается, что новый поток состоит из ссылок на один и тот же объект. При этом метод convertToSomeObject вызывался для каждого элемента потока и каждый раз значения полей объекта перезаписывались
При выполнении строчки
list.stream().map(item -> new SomeObject().convertToSomeObject(item))
происходит следующее:
SomeObject до вызова map не создаётсяmap передаётся лямбда-функция, которая работает как обычная функция:
itemSomeObjectconvertToSomeObject у созданного экземпляра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).
Как развивать веб-проекты в 2026 году: технологии, контент E-E-A-T и факторы доверия
Современные инструменты для криптотрейдинга: как технологии помогают принимать решения
Апостиль в Лос-Анджелесе без лишних нервов и бумажной волокиты
Основные этапы разработки сайта для стоматологической клиники