Я пытался преобразовать массив 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>
R
является универсальным типом результирующего типа.A
универсальный тип промежуточного типа накопления коллектора. Это деталь реализации того, как работает коллектор. Он разделяет и захватывает, также для параллельной обработки, сначала собирает в промежуточные типы.Collectors.toList()
в этом случае возвращаетArrayList<Integer>
» Может не вернутьArrayList
.List
Реализация не определена , так что вы не можете полагаться на то , что реализация возвращается. Как сказано в javadoc : «Нет никаких гарантий относительно типа , изменчивости, сериализуемости или безопасности потоков возвращаемого List»;toList()
не возвращаетArrayList
илиList
- он возвращает aCollector
, что в конечном итоге создаст и вернет aList
- также документация гласит: «... Нет никаких гарантий относительно типа , изменчивости, сериализуемости или безопасности потока возвращаемого списка; если требуется больший контроль над возвращенным списком, используйте toCollection (Supplier) .... "Ответы:
Это реализация по умолчанию.
ArrayList
используется, потому что это лучше в большинстве случаев, но если это не подходит для вас, вы всегда можете определить свой собственный коллектор и предоставить фабрику дляCollection
вашего желания:Да,
A
иR
являются общими параметрами этого метода,R
это тип возвращаемого значения,T
является типом ввода иA
является промежуточным типом, который появляется во всем процессе сбора элементов (может быть невидимым и не относится к этой функции). НачалоCollector
Javadoc «S определяет те типы (они совместимы по всему документу):источник
List<Integer> myList = Arrays.stream(arr).boxed().collect(Collectors.toList());
и вызывать только методы, объявленные в интерфейсе List на myList. В противном случае я бы подверг себя риску, если Oracle решит изменить реализацию по умолчанию в Java8u1024 или 15?List
, поэтому, независимо от используемой реализации, поведение будет одинаковым. Вряд ли интерфейс будет изменен в более новых версиях Java.Как предполагает определение метода, он возвращает реализацию Collector с поставщиком коллекционера as
ArrayList
. Следовательно, из определения метода ниже очень ясно, чтоCollectors.toList
всегда возвращается 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)
средствЕсли вы ссылаетесь на комментарии к документации, в ней точно упоминаются следующие общие типы:
источник
Collectors.toList()
(первый фрагмент)? Это openjdk?