Tworzenie nowych obiektów przy użyciu strumieni Java 8

Czy jest różnica w używaniu następujących kontrukcji, inna niż nieco lepsza czytelność w tych ostatnich?

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

someList.stream().map(NewClass::new).collect(Collectors.toList());
Author: Tagir Valeev, 2015-08-01

1 answers

Ogólnie nie ma różnicy. NewClass::new generuje mniej bajtowego kodu, tak jak w wersji lambda, automatycznie wygenerowana prywatna metoda jest tworzona przez kompilator Javy z ciała lambda, podczas gdy NewClass:new bezpośrednio łączy się z konstruktorem metody handle. Więc używając odwołań do metod możesz mieć nieco mniejszy rozmiar pliku klasy. Nie oczekuje się jednak znaczącej różnicy w wydajności.

Inną różnicą jest procedura rozwiązywania metod. Nie ma zastosowania w twoim konkretnym przykładzie, ale może mieć zastosowanie w inny kod. Na przykład masz dwa konstruktory:

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

I masz jakąś metodę, która akceptuje interfejs funkcjonalny:

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

Wtedy można nazwać go zarówno lambda, jak i funkcjonalnym interfejsem:

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

Ale załóżmy, że później dodasz nową metodę o tej samej nazwie jak ta:

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

Wtedy wywołanie referencji metody stanie się niejednoznaczne i spowoduje błąd kompilacji, ponieważ NewClass::new pasuje teraz do obu konstruktorów, podczas gdy lambda jest nadal jednoznaczna.

 36
Author: Tagir Valeev,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-08-01 17:19:42