Вообще-то нет разницы. NewClass::new
производит меньше байт-кода, как в лямбда-версии, автоматически созданный частный метод создается java-компилятором из тела лямбда, тогда как NewClass:new
напрямую ссылается на дескриптор метода конструктора. Таким образом, используя ссылки на методы, вы можете иметь немного меньше размера файла класса. Однако существенной разницы в производительности не ожидается.
Еще одно отличие - процедура разрешения метода. Он не применим в вашем конкретном примере, но может применяться в другом коде. Например, у вас есть два конструктора:
public NewClass(String a) {...}
public NewClass(String a, String b) {...}
А у вас есть какой-то метод, который принимает функциональный интерфейс:
public myMethod(Function<String, NewClass> fn) {...}
Тогда вы можете назвать его как с лямбда или функционального интерфейса:
myMethod(str -> new NewClass(str));
myMethod(NewClass::new);
Но предположим, что позже вы добавляете новый метод с тем же именем:
public myMethod(BiFunction<String, String, NewClass> fn) {...}
Затем вызов метода будет неоднозначным и приведет к ошибке компиляции, так как NewClass::new
теперь соответствует обоим конструкторам, в то время как лямбда по-прежнему недвусмысленна.
Кажется, что вы имеете в виду 'item -> новый NewClass (item)', правильно? –
Да @TagirValeev пятно на! – ShellDragon
Downvoters, не могли бы вы объяснить, почему? – ShellDragon