Я пытался преобразовать массив int в List, и я выбрал незнакомый путь использования Java 8 Stream и придумал
Arrays.stream(arr).boxed().collect(Collectors.toList());
Я до сих пор с трудом полностью понимаю эту строку, в основном,
Почему
Collectors.toList()
в этом случае возвращаетсяArrayList<Integer>
реализующийList
интерфейс? Почему нетLinkedList<Integer>
или какой-либо другой универсальный класс, соответствующийList
интерфейсу? Я ничего не могу найти по этому поводу, за исключением краткого упоминания ArrayList здесь , в разделе API Notes.Что означает левая панель ? Очевидно, это общий тип возврата ( в моем коде здесь). И я думаю, что это аргумент общего типа метода, но как они указаны? Я заглянул в интерфейсный документ Collector и не смог его поглотить.
Stream.collect()
R
ArrayList<Integer>
<R, A>
Collectors.toList()
в этом случае возвращает ArrayList<Integer>
» Может не вернуть ArrayList
. List
Реализация не определена , так что вы не можете полагаться на то , что реализация возвращается. Как сказано в javadoc : «Нет никаких гарантий относительно типа , изменчивости, сериализуемости или безопасности потоков возвращаемого List»;
toList()
не возвращает ArrayList
или List
- он возвращает a Collector
, что в конечном итоге создаст и вернет a List
- также документация гласит: «... Нет никаких гарантий относительно типа , изменчивости, сериализуемости или безопасности потока возвращаемого списка; если требуется больший контроль над возвращенным списком, используйте toCollection (Supplier) .... "
R
является универсальным типом результирующего типа.A
универсальный тип промежуточного типа накопления коллектора. Это деталь реализации того, как работает коллектор. Он разделяет и захватывает, также для параллельной обработки, сначала собирает в промежуточные типы.