Próbowałem przekonwertować tablicę int na List i wybrałem nieznaną drogę korzystania z Java 8 Stream i wymyśliłem to
Arrays.stream(arr).boxed().collect(Collectors.toList());
Nadal mam trudności z pełnym zrozumieniem tej linii, głównie
Dlaczego
Collectors.toList()
w tym przypadku zwraca interfejsArrayList<Integer>
implementującyList
? Dlaczego nieLinkedList<Integer>
lub inna ogólna klasa zgodna zList
interfejsem? Nie mogę nic na ten temat znaleźć, oprócz krótkiej wzmianki o ArrayList tutaj , w sekcji Notatki API.Co oznacza lewy panel ? Oczywiście jest to ogólny typ zwrotu ( w moim kodzie tutaj). I myślę, że jest argumentem typu ogólnego w metodzie, ale jak są one określone? Przejrzałem dokument interfejsu Collectora i nie byłem w stanie go wchłonąć.
Stream.collect()
R
ArrayList<Integer>
<R, A>
Collectors.toList()
w tym przypadku zwraca ArrayList<Integer>
„ To może nie zwrócić ArrayList
. List
Realizacja jest niezdefiniowane , więc nie można polegać na tym, co implementacja zwróci. Jak mówi javadoc : „Nie ma żadnych gwarancji co do typu , zmienności, możliwości serializacji lub bezpieczeństwa wątków zwróconej listy;”
toList()
nie zwraca ArrayList
lub List
- zwraca a Collector
, który ostatecznie utworzy i zwróci a List
- również dokumentacja stwierdza: „... Nie ma gwarancji co do typu , zmienności, możliwości serializacji lub bezpieczeństwa wątków zwróconej listy; jeśli wymagana jest większa kontrola nad zwróconą listą, użyj toCollection (dostawca) .... ”
R
jest ogólnym typem typu wynikowego.A
ogólny rodzaj pośredniego typu akumulacji kolektora. Jest to szczegół implementacji działania kolektora. Dzieląc i podbijając, również w przypadku przetwarzania równoległego, najpierw zbiera się w typy pośrednie.