0

"Новая инстанциация объектов при использовании потоков Java 8"

9

Я встречаюсь с вопросом о различиях между двумя конструкциями в Java, которые используют стримы и метод map. Кроме того, что вторая конструкция немного более читаема, есть ли какие-либо другие различия в их использовании?

Привожу примеры обоих подходов:

someList.stream().map(item -> new NewClass(item)).collect(Collectors.toList());

someList.stream().map(NewClass::new).collect(Collectors.toList());

Заранее благодарен за разъяснения!

1 ответ(ов)

0

В общем случае разницы нет. NewClass::new генерирует меньше байт-кода, поскольку в случае с ламбдой компилятор Java создает автоматически метод, который будет приватным и будет содержать тело ламбды, в то время как NewClass::new напрямую ссылается на метод-конструктор. Таким образом, использование ссылок на методы может немного уменьшить размер файла класса. Однако существенной разницы в производительности ожидать не стоит.

Еще одно отличие касается процедуры разрешения методов. Это может не быть актуально в вашем конкретном примере, но может касаться других участков кода. Например, если у вас есть два конструктора:

public NewClass(String a) {...}
public NewClass(String a, String b) {...}

И метод, принимающий функциональный интерфейс:

public void myMethod(Function<String, NewClass> fn) {...}

Вы можете вызвать его как с ламдой, так и со ссылкой на метод:

myMethod(str -> new NewClass(str));
myMethod(NewClass::new);

Но предположим, что позже вы добавите новый метод с таким же именем:

public void myMethod(BiFunction<String, String, NewClass> fn) {...}

В этом случае вызов со ссылкой на метод станет неоднозначным и приведет к ошибке компиляции, поскольку NewClass::new теперь соответствует обоим конструкторам, в то время как ламбда останется однозначной.

Чтобы ответить на вопрос, пожалуйста, войдите или зарегистрируйтесь