"Новая инстанциация объектов при использовании потоков Java 8"
Я встречаюсь с вопросом о различиях между двумя конструкциями в Java, которые используют стримы и метод map
. Кроме того, что вторая конструкция немного более читаема, есть ли какие-либо другие различия в их использовании?
Привожу примеры обоих подходов:
someList.stream().map(item -> new NewClass(item)).collect(Collectors.toList());
someList.stream().map(NewClass::new).collect(Collectors.toList());
Заранее благодарен за разъяснения!
1 ответ(ов)
В общем случае разницы нет. 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
теперь соответствует обоим конструкторам, в то время как ламбда останется однозначной.
Java 8: Преобразование List<V> в Map<K, V>
Java 8: Как использовать лямбда-функцию, которая выбрасывает исключение?
Есть ли краткий способ итерации по стриму с индексами в Java 8?
Java 8 Iterable.forEach() против цикла foreach: что выбрать?
Java Лямбда-выражения [закрыто]