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());
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.
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