Вопрос-ответ

Arrays.asList() not working as it should?

Arrays.asList() работает не так, как должно?

У меня есть float[], и я хотел бы получить список с теми же элементами. Я мог бы сделать некрасивую вещь, добавив их один за другим, но я хотел использовать метод Arrays.asList . Однако есть проблема. Это работает:

List<Integer> list = Arrays.asList(1,2,3,4,5);

Но это не так.

int[] ints = new int[] {1,2,3,4,5};
List<Integer> list = Arrays.asList(ints);

Метод asList принимает параметр varargs, который, насколько мне известно, является "сокращением" для массива.

Вопросы:


  • Почему второй фрагмент кода возвращает List<int[]> но не List<int>.


  • Есть ли способ это исправить?


  • Почему здесь не работает автофиксация; т.е. int[] В Integer[]?


Переведено автоматически
Ответ 1

В Java нет такого понятия, как List<int> - дженерики не поддерживают примитивы.

Автоматическая блокировка происходит только для одного элемента, не для массивов примитивов.

Что касается того, как это исправить - существуют различные библиотеки с множеством методов для выполнения подобных действий. Обойти это невозможно, и я не думаю, что в JDK есть что-то, что могло бы упростить задачу. Некоторые будут оборачивать примитивный массив в список типа wrapper (чтобы при доступе происходила упаковка), другие будут выполнять итерации по исходному массиву для создания независимой копии, по мере их обработки. Убедитесь, что вы знаете, какой из них вы используете.

(РЕДАКТИРОВАТЬ: я предполагал, что отправная точка для int[] не подлежит обсуждению. Если вы можете начать с Integer[], то вы далеко продвинулись :)

Просто для одного примера вспомогательной библиотеки и для того, чтобы немного подключить Guava, есть com.google.common.primitive.Ints.asList.

Ответ 2

Как насчет этого?

Integer[] ints = new Integer[] {1,2,3,4,5};
List<Integer> list = Arrays.asList(ints);
Ответ 3

Потому что java arrays являются объектами и Arrays.asList() обрабатывает ваш int array как единственный аргумент в списке varargs .

Ответ 4

Введите Java 8, и вы сможете выполнить следующие действия для сбора в коробочный массив:

Integer[] boxedInts = IntStream.of(ints).boxed().toArray(Integer[]::new);

Или это собрать в коробочный список

List<Integer> boxedInts = IntStream.of(ints).boxed().collect(Collectors.toList());

Однако это работает только для int[], long[] и double[]. Это не будет работать для byte[].

Обратите внимание, что Arrays.stream(ints) и IntStream.of(ints) эквивалентны. Таким образом, два предыдущих примера также можно переписать как:

Integer[] boxedIntArray = Arrays.stream(ints).boxed().toArray(Integer[]::new);
List<Integer> boxedIntList = Arrays.stream(ints).boxed().collect(Collectors.toList());

Эта последняя форма может быть предпочтительнее, поскольку она опускает примитивный специфический подтип Stream. Однако внутренне это все еще набор перегруженных, которые в этом случае все еще создают IntStream внутренне.

java arrays list