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 zListinterfejsem? 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()RArrayList<Integer><R, A>
Collectors.toList()w tym przypadku zwraca ArrayList<Integer>„ To może nie zwrócić ArrayList. ListRealizacja 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 ArrayListlub 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) .... ”
Rjest ogólnym typem typu wynikowego.Aogó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.