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>
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.Collectors.toList()
w tym przypadku zwracaArrayList<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 zwracaArrayList
lubList
- zwraca aCollector
, który ostatecznie utworzy i zwróci aList
- 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) .... ”Odpowiedzi:
Jest to domyślna implementacja.
ArrayList
jest używany, ponieważ najlepiej sprawdza się w większości przypadków użycia, ale jeśli nie jest on odpowiedni dla Ciebie, zawsze możesz zdefiniować własny kolektor i dostarczyć fabrykę według własnegoCollection
uznania:Tak,
A
iR
są ogólnymi parametrami tej metody,R
jest to typ zwracany,T
jest typem wejściowym iA
jest typem pośrednim, który pojawia się w całym procesie gromadzenia elementów (może nie być widoczny i nie dotyczy tej funkcji). PoczątekCollector
javadoc definiuje te typy (są one spójne w całym dokumencie):źródło
List<Integer> myList = Arrays.stream(arr).boxed().collect(Collectors.toList());
i wywoływać tylko metody zadeklarowane w interfejsie List na myList. W przeciwnym razie potencjalnie naraziłbym się na ryzyko, jeśli Oracle zdecyduje się zmienić domyślną implementację w Javie8u1024 lub 15?List
, więc niezależnie od zastosowanej implementacji zachowanie jest takie samo. Jest mało prawdopodobne, że interfejs zostanie zmieniony w nowszych wersjach Java.Jak sugeruje definicja metody, zwraca implementację Collectora z dostawcą collector as
ArrayList
. Dlatego bardzo wyraźnie wynika z poniższej definicji metody, któraCollectors.toList
zawsze zwraca ArrayList collector (While it's arguable why toList not toArrayList word is used in method name
).<R, A> R collect(Collector<? super T, A, R> collector)
środkówJeśli odwołujesz się do komentarzy do dokumentacji, dokładnie wspomina, jakie są te typy ogólne:
źródło
Collectors.toList()
(pierwszy fragment)? Czy to jest openjdk?